Compare commits

..

59 Commits

Author SHA1 Message Date
Tom Rothamel ce49560cc6 Doc fixes. 2021-12-02 01:59:02 -05:00
Tom Rothamel 1c60c21dad Flush the render cache whenever a file is flushed.
This means that if the file is used in a way that is not
subject to normal invalidation, it's still flushed.
2021-12-01 01:32:57 -05:00
Tom Rothamel b08a5dea70 Check in updated keywords. 2021-11-30 18:50:59 -05:00
Tom Rothamel 6b9380f9d6 Make caret_blink available in screen language.
Fixes #3150.
2021-11-30 18:30:22 -05:00
Tom Rothamel 72967d33e1 Revert "Revert "Add config.mouse_focus_clickthrough.""
This reverts commit 1d3b6ffdf0.
2021-11-30 18:24:24 -05:00
Tom Rothamel 2e59657653 Revert "Revert "Enable config.mouse_focus_clickthrough in the launcher.""
This reverts commit 5c63d9cee8.
2021-11-30 18:20:42 -05:00
Tom Rothamel 50828cb688 Run fix_translations. 2021-11-28 16:32:02 -05:00
Tom Rothamel c1f5401101 Update changelog. 2021-11-28 16:31:57 -05:00
Tom Rothamel a508a6c5fa Always run an unfocused handler when a displayable remains shown.
Ren'Py will now always run an `unhovered` action when a displayable (or its
replacement) remains shown, and the focus changes. Previously, the unhovered
action would not run when the loss of focus was caused by showing a second
screen.

This traces back to LSF PM 295318 (and the rest of that thread.)
2021-11-28 16:31:20 -05:00
loliconazter a2fc6e4a97 Update developer.rpy 2021-11-28 16:28:51 -05:00
loliconazter 348accd819 Update common.rpy 2021-11-28 16:28:46 -05:00
loliconazter a5d44c5f6d Update launcher.rpy
fixing some translation and some translation "renpyweb" section
2021-11-28 16:28:41 -05:00
Tom Rothamel b9acd8bf0b Prevent pausebehavior from timing out with a modal above. 2021-11-28 16:28:37 -05:00
Tom Rothamel a8baa0fc2a Remove use of renpy.angle.
It wasn't used for much anymore, now that angle support goes
through uguu.
2021-11-28 16:28:29 -05:00
Tom Rothamel cc59f46f97 live2d: If a curve ends early, repeat the last segement.
This prevents rounding errors or bad curves from resetting portions
of a motion.
2021-11-28 16:27:59 -05:00
Tom Rothamel 162f22d6f5 Do not trigger timers on modal TIMEEVENTs. 2021-11-28 16:27:54 -05:00
Tom Rothamel 9e28b55ea9 Continue processing modal timeevents. 2021-11-28 16:27:51 -05:00
Tom Rothamel a38803ec71 Ensure replaces is of the correct type.
Fixes #3138.
2021-11-28 16:27:47 -05:00
Tom Rothamel 6eca382a5a Separate out invalidation and deallocation of renders.
Fixes #3135, which was caused by invalidation at the start of a
screen.
2021-11-28 16:27:40 -05:00
kigyo 002d7aadf2 Update German translation in common.rpy
I noticed many of the "German" translations were left in English. I tried to fix as many as I could, but a few I was still unsure about. ("Clipboard voicing", for example.)
In general, these older translation files seem to be missing strings from the renderer (shift+G) screen.
2021-11-28 16:27:29 -05:00
loliconazter b6550ada06 Update launcher.rpy 2021-11-28 16:23:41 -05:00
Tom Rothamel 7f9b9d32cf sl2: Re-fix scopes.
This reintroduces some of the reverted fixes, but at the same time,
avoids th problems those fixes caused by storing the scope given
to the screen in the main context, meaning that it's no longer
required that scope remain the same object as the game changes.

(In practice, there were enough things that could changes the main
scope that it was hard to keep object identity stable.)
2021-11-28 16:23:38 -05:00
Tom Rothamel 2a7d629d04 Revert "sl2: Reuse the scope object in use w/o parameters."
This reverts commit 3f7e65ae84.
2021-11-28 16:23:33 -05:00
Tom Rothamel 00a9d2ec80 Revert "Remove debug print."
This reverts commit 315451b1c5.
2021-11-28 16:22:16 -05:00
Tom Rothamel d76978f1b2 Revert "sl2: Store the scope as part of the screen cache."
This reverts commit 0a55f8a9ee.
2021-11-28 16:22:16 -05:00
Tom Rothamel 357e53a1ab Revert "Ensure that current_screen.scope is the scope that the screen is executing in."
This reverts commit 095e94cfff.
2021-11-28 16:21:38 -05:00
Tom Rothamel 64acbf5adf Ensure that current_screen.scope is the scope that the screen is executing in.
Fixes parts of #3131's third comment.
2021-11-28 16:21:09 -05:00
Tom Rothamel da38eed1ae Synchro start should only unpause if a channel is not playing.
This keeps unpause_all from starting channels that it should not.

Fixes #3136.
2021-11-28 16:21:02 -05:00
Tom Rothamel e9a1a02135 Upgrade _seen_audio on load.
Fixes #3134.
2021-11-28 16:20:45 -05:00
Tom Rothamel b2d7232d31 Store the string giving the filename into _seen_audio, when AudioData is involved.
Per #3134.
2021-11-28 16:20:40 -05:00
Tom Rothamel 3fbf27a6fa Set the renpy.export.platform variables properly. 2021-11-28 16:20:34 -05:00
Tom Rothamel 759ef31065 Use the variant to set the rollback side.
renpy.exports.platform is set too late to be useful.
2021-11-28 16:20:25 -05:00
Tom Rothamel c18b987e17 Make the emulated keyboard transparent.
This makes it possible to see the console in the emulator.
2021-11-28 16:19:12 -05:00
Tom Rothamel ddd0d1b30d Fix a problem with menus and config.log.
Fixes #3133.
2021-11-28 16:18:43 -05:00
Tom Rothamel 91c730cb2d Update the included games to use gui.variant. 2021-11-28 16:18:24 -05:00
Tom Rothamel 99496696bd Add gui.variant.
This is a decorator that calls a function when a variant is
active, and then again each time the gui is rebuilt.

Addresses the second issue in #3130.
2021-11-28 16:18:17 -05:00
Tom Rothamel 859d34994e Use the emulated mobile variable for the rollback side preference.
This matches the rollback side the emulator uses.
2021-11-28 16:18:10 -05:00
Tom Rothamel bb0c2028bf sl2: Store the scope as part of the screen cache.
This means that the same scope objecty can be reused, which
is necessary for the new uses_scope work.

Per #3131.
2021-11-28 16:16:21 -05:00
Tom Rothamel 56aa271554 web: Check for progressive downloads once per frame.
This is up from once per interaction, and only when Ren'Py is idle.
This allows progressive downloads to be loaded in the middle of
an interaction.

Fixes #3125.
2021-11-16 22:18:55 -05:00
Tom Rothamel cda38a4aca live2d: Always fade when switching from one motion to another. 2021-11-16 22:18:55 -05:00
Tom Rothamel 509e0ed2f2 Remove a debug print. 2021-11-16 22:18:55 -05:00
Tom Rothamel 116ccc9c3c live2d: Remove debug print. 2021-11-16 22:18:55 -05:00
Tom Rothamel 0ff3b243c5 live2d: Do not prevent seamless motions from looping. 2021-11-16 22:18:55 -05:00
Tom Rothamel 92ca5e9add Update the changelong. 2021-11-16 22:18:55 -05:00
Tom Rothamel 9651cc2ed8 live2d: Move to using saturation arithmetic for models.
This is an attempt to better implement the live2d fading semantics,
found at:

https://docs.live2d.com/cubism-editor-manual/about-fade/?locale=en_us

The idea is that if both motions have a parameter at the same
value, it shouldn't change, so that if we have .75 of A and .25
from B, the result should be .25 + .75 rather than
.75 * (1 - .25) + .25, which has the value of .8125.
2021-11-16 22:18:55 -05:00
Tom Rothamel 2065f82f89 live2d: When a motion is fading out, do not loop it or replace it with the next motion. 2021-11-16 22:18:55 -05:00
Tom Rothamel 15b23d8ea0 Fix typo.
Fixes #3127.
2021-11-16 22:18:55 -05:00
Tom Rothamel e8e206dbba Store the layer_at/camera lists with layers.
And reuse them when creating the layer in the old store. This
allows the old layer_at lists to be used in a layer's _in_current_store
method.

Fixes #3126.
2021-11-16 22:18:55 -05:00
Tom Rothamel 39350f4778 gl2: Use GL_LEQUALS rather than GL_LESS when gl_depth is true.
This reduces astonishment by making the behavior equal to what
Ren'Py would do normally.

Per p547953.

Not compatted, because gl_depth is probably fairly new when it
comes to use, and it's probably best to treat the behavior up
to now as undefined.
2021-11-16 22:18:55 -05:00
Tom Rothamel 72f3798741 Remove debug print. 2021-11-16 22:18:55 -05:00
Tom Rothamel 98e06eaba9 sl2: Reuse the scope object in use w/o parameters.
This ensures the object keeps the same identity, which means
that use without parameters works with the changes to uses_scope
in 43403e787e .

Fixes #195.
2021-11-09 23:11:30 -05:00
Tom Rothamel 34dbd3f5f8 Changelog more of the things. 2021-11-08 20:56:42 -05:00
Tom Rothamel 8011545b88 Update sponsors. 2021-11-08 19:29:05 -05:00
Tom Rothamel ba0ffeb7d0 Lower version to 7.4.11. 2021-11-07 20:43:47 -05:00
Tom Rothamel f32c448d02 Remove the 7.5 changelog. 2021-11-07 20:08:00 -05:00
Tom Rothamel 3c0c1ffb84 Revert "Tweak the priority of compat, so it can better address styles and common."
This reverts commit 0f8610c8af.
2021-11-07 19:55:27 -05:00
Tom Rothamel 5d167a881d Revert "Change the default for style.drag.focus_mask to False."
This reverts commit c9e3ac12bc.
2021-11-07 19:55:13 -05:00
Tom Rothamel 1d3b6ffdf0 Revert "Add config.mouse_focus_clickthrough."
This reverts commit 0192c3bfdb.
2021-11-07 19:54:07 -05:00
Tom Rothamel 5c63d9cee8 Revert "Enable config.mouse_focus_clickthrough in the launcher."
This reverts commit b7e53ccf74.
2021-11-07 19:53:11 -05:00
967 changed files with 65218 additions and 154838 deletions
+13
View File
@@ -0,0 +1,13 @@
[run]
plugins = renpycoverage
[report]
omit =
keywords.py
style.pxd
*pygame_sdl2*
*.rpyc
*/game/*
*style_*_functions.pyx
renpy/gl/gl.pyx
renpy/gl/gl1.pyx
+86 -109
View File
@@ -10,127 +10,104 @@ ehthumbs.db
ehthumbs_vista.db
[Dd]esktop.ini
# Python related files.
*.pyc
*.pyo
*.pyi
*.egg-info
# Editor/tool files.
*~
*.bak
.gdb_history
# Compiled Ren'Py files.
*.rpyc
*.rpyb
*.rpymc
*.pyc
*.pyo
*~
*.bak
saves
tmp
cache
env
# Ren'Py log files.
log.txt
errors.txt
traceback.txt
lint.txt
# Created directories.
saves/
tmp/
cache/
styles.txt
# Executables.
/renpy.exe
/renpy2.exe
/renpy3.exe
/renpy-32.exe
/renpy.sh
/renpy2.sh
/renpy3.sh
/renpy.app
/renpy2.app
/renpy3.app
/7z.sfx
# Libraries.
/lib
# Platforms.
/rapt
/rapt2
/rapt3
/renios
/renios2
/renios3
/web
/web2
/web3
# Docs.
/sphinx/source/inc
/sphinx/source/thequestion.rst
/doc
/doc-web
/LICENSE.txt
# Gui template.
/gui/game/gui
# Editors.
/android
/build
/dist
/dists
/renpy.app
/jedit
/atom
/vscode
# Generated source.
/renpy/vc_version.py
/module/gen/
/module/gen3/
/module/gen-static/
/module/gen3-static/
/tutorial/game/tutorial_director.rpy
# Module build.
/module/build
/module/dist
/module/emscripten-static
# Download target.
/dl
# Pygame_sdl2.
/pygame_sdl2
# Updater.
update.pem
# Steam.
steam_appid.txt
/steamapi.py
# Android.
*.keystore
# Type analysis.
/typings
# Live2D
cubism
CubismSdkForNative-4-*.zip
# Created files.
/lint.txt
/renpy.code
/*testing*
/screenshot*
.android.json
/renpy.exe
/renpy-32.exe
/renpy.sh
/lib
/lib.old
/lib2
/lib3
/doc
/.pydevproject
/.pydevproject.bak
/.project
/.cproject
/.settings
/LICENSE.txt
/templates/english/README.html
/the_question/README.html
/tutorial/README.html
/renpy/angle/*.pyx
/renpy/angle/*.pxd
/renpy-ppc.zip
/module/build
/module/gen*
/editra
/atom
/launcher/game/theme
/launcher/game/script_version.rpy
# Old files.
/0old
/dl
renpy/vc_version.py
.externalToolBuilders
/rapt
/evil
/iaptest
/pygame_sdl2
/renios
/steam_appid.txt
/.coverage
/id
/ai
/interface_7
/htmlcov
/the_question*/.android.json
/WINDOWS.rst
/old
# Works in progress, throwaway scripts, etc.
/scratch
/*-dists
/c
/cg
/.vscode/launch.json
/.vscode/tasks.json
/*-all/
/*-win/
/*-mac/
/*-linux*/
/*-dists/
doc-web
sphinx/source/inc
sphinx/source/thequestion.rst
tutorial/game/tutorial_director.rpy
launcher/theme
module/emscripten-static/
web/
cubism
glexperiment
live2d
rapt2
rapt3
renios2
renios3
notarized
CubismSdkForNative-4-*.zip
+2
View File
@@ -0,0 +1,2 @@
[pep8]
ignore=E123,E20,E22,E501,E702,E266,E265,E262
-249
View File
@@ -1,249 +0,0 @@
{
"files.watcherExclude": {
"**/renpy/0old/**" : true,
"**/renpy/atom/**" : true,
"**/renpy/cubism/**" : true,
"**/renpy/dists/**" : true,
"**/renpy/dl/**" : true,
"**/renpy/doc/**" : true,
"**/renpy/doc-web/**" : true,
"**/renpy/jedit/**" : true,
"**/renpy/renpy*.app/**" : true,
"**/renpy/tmp/**" : true,
"**/renpy/web/**" : true,
},
"files.exclude": {
"0old": true,
"**-dists": true,
"**/*.pyc": true,
"**/*.pyo": true,
"renpy/**/*.pyi": true,
"**/*.rpmc": true,
"**/*.rpyc": true,
"**/__pycache__": true,
"**/screenshot-*": true,
"7z.sfx": true,
"atom": true,
"cubism": true,
"dl": true,
"doc": true,
"doc-web": true,
"jedit": true,
"lib*": true,
"live2d": true,
"rapt*": true,
"renios*": true,
"renpy*.app": true,
"renpy*.exe": true,
"tmp": true,
"vscode": true,
"web": true,
"web2": true,
"web3": true,
"**/*.rpa": true,
"**/*.rpymc": true,
"**/cache/": true
},
"python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic",
"python.analysis.diagnosticMode": "workspace",
"python.linting.pylintEnabled": false,
"python.analysis.diagnosticSeverityOverrides": {
"reportMissingModuleSource": "none"
},
"esbonio.server.enabled": true,
"esbonio.sphinx.confDir": "",
"renpy.excludeCompiledFilesFromWorkspace": true,
"renpy.watchFoldersForChanges": false,
"renpy.warnOnInvalidVariableNames": "Disabled",
"renpy.warnOnInvalidFilenameIssues": "Disabled",
"renpy.warnOnIndentationAndSpacingIssues": "Disabled",
"editor.tokenColorCustomizations": {
"[*Light*]": {
"textMateRules": [
{
"scope": "ref.matchtext",
"settings": {
"foreground": "#000"
}
}
]
},
"[*Dark*]": {
"textMateRules": [
{
"scope": "ref.matchtext",
"settings": {
"foreground": "#fff"
}
}
]
},
"textMateRules": [
{
"scope": "renpy.meta.plain",
"settings": {
"fontStyle": ""
}
},
{
"scope": "renpy.meta.i",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "renpy.meta.b",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": [
"renpy.meta.u",
"renpy.meta.a"
],
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "renpy.meta.s",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b",
"settings": {
"fontStyle": "italic bold"
}
},
{
"scope": "renpy.meta.i renpy.meta.u",
"settings": {
"fontStyle": "italic underline"
}
},
{
"scope": "renpy.meta.i renpy.meta.s",
"settings": {
"fontStyle": "italic strikethrough"
}
},
{
"scope": "renpy.meta.b renpy.meta.u",
"settings": {
"fontStyle": "bold underline"
}
},
{
"scope": "renpy.meta.b renpy.meta.s",
"settings": {
"fontStyle": "bold strikethrough"
}
},
{
"scope": "renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "underline strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u",
"settings": {
"fontStyle": "italic bold underline"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.s",
"settings": {
"fontStyle": "italic bold strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "italic underline strikethrough"
}
},
{
"scope": "renpy.meta.b renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "bold underline strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "italic bold underline strikethrough"
}
},
{
"scope": "renpy.meta.color.text",
"settings": {
"foreground": "#ffffff"
}
},
{
"scope": "renpy.meta.color.#f00",
"settings": {
"foreground": "#f00"
}
},
{
"scope": "text.notes.info",
"settings": {
"foreground": "#17a2b8",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.success",
"settings": {
"foreground": "#28a745",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.warning",
"settings": {
"foreground": "#ffc107",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.danger",
"settings": {
"foreground": "#dc3545",
"fontStyle": "bold"
}
},
{
"scope": "renpy.meta.color.#fff",
"settings": {
"foreground": "#fff"
}
},
{
"scope": "renpy.meta.color.#fcc",
"settings": {
"foreground": "#fcc"
}
},
{
"scope": "renpy.meta.color.#cfc",
"settings": {
"foreground": "#cfc"
}
},
{
"scope": "renpy.meta.color.#c00",
"settings": {
"foreground": "#c00"
}
}
]
},
}
-12
View File
@@ -1,12 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "run.sh --build",
"type": "shell",
"command": "/home/tom/ab/renpy/run.sh --build",
}
]
}
BIN
View File
Binary file not shown.
+10 -15
View File
@@ -49,34 +49,29 @@ Building the modules requires you have the many dependencies installed on
your system. On Ubuntu and Debian, these dependencies can be installed with
the command::
sudo apt install virtualenvwrapper python3-dev libavcodec-dev libavformat-dev \
libswresample-dev libswscale-dev libharfbuzz-dev libfreetype6-dev libfribidi-dev libsdl2-dev \
libsdl2-image-dev libsdl2-gfx-dev libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev
Ren'Py requires SDL_image 2.6 or greater. If your distribution doesn't include
that version, you'll need to download it from:
https://github.com/libsdl-org/SDL_image/tree/SDL2
apt-get install virtualenvwrapper python-dev libavcodec-dev libavformat-dev \
libavresample-dev libswresample-dev libswscale-dev libfreetype6-dev libglew1.6-dev \
libfribidi-dev libsdl2-dev libsdl2-image-dev libsdl2-gfx-dev \
libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev
We strongly suggest installing the Ren'Py modules into a Python
virtualenv. To create a new virtualenv, open a new terminal and run::
. /usr/share/virtualenvwrapper/virtualenvwrapper.sh
mkvirtualenv renpy
To return to this virtualenv later, run::
. /usr/share/virtualenvwrapper/virtualenvwrapper.sh
workon renpy
After activating the virtualenv, install additional dependencies::
After activating the virtualenv, install cython, future, and six::
pip install -U cython future six typing pefile requests ecdsa
pip install -U cython future six
Then, install pygame_sdl2 by running the following commands::
git clone https://www.github.com/renpy/pygame_sdl2
pushd pygame_sdl2
python fix_virtualenv.py $VIRTUAL_ENV
python setup.py install
python setup.py install_headers
popd
@@ -85,7 +80,7 @@ Next, set RENPY_DEPS_INSTALL To a \:-separated (\;-separated on Windows)
list of paths containing the dependencies, and RENPY_CYTHON to the name
of the cython command::
export RENPY_DEPS_INSTALL="/usr:/usr/lib/$(gcc -dumpmachine)/"
export RENPY_DEPS_INSTALL="/usr:/usr/lib/$(uname -m)-linux-gnu/"
export RENPY_CYTHON=cython
Finally, use setup.py in the Ren'Py ``module`` directory to compile and
@@ -98,7 +93,7 @@ install the modules that support Ren'Py::
Ren'Py will be installed into the activated virtualenv. It can then be run
using the command::
python renpy.py
python -O renpy.py
Documentation
@@ -112,7 +107,7 @@ link in a nightly build, or compile the modules as described above. You'll
also need the `Sphinx <https://www.sphinx-doc.org>`_ documentation generator.
If you have pip working, install Sphinx using::
pip install -U sphinx sphinx_rtd_theme sphinx_rtd_dark_mode
pip install -U sphinx
Once Sphinx is installed, change into the ``sphinx`` directory inside the
Ren'Py checkout and run::
+1 -20
View File
@@ -42,23 +42,4 @@ those related to coding) are deliberately left untranslated (or the original wor
are provided in brackets) to avoid confusion, relying on their common use in
Turkish language and among Turkish developers.
* Arda Güler (WKFO) <ardaguler09@gmail.com>
Finnish
---------
Translation to the Finnish language. Most terms have been translated,
sometimes requiring some imagination to come up with suitable terms.
The quality is not perfect, but it should make sense to any developer
fluent in Finnish but not English. Adjustments will be made if better
translations are suggested.
* Lari Liuhamo (Diapolo10) <lari.liuhamo+github116504@gmail.com>
Ukrainian
---------
Translation to Ukrainian language. Most of translations provided by Veydzher.
Feel free to report me any mistakes, fixes or improvements.
* Veydzher <veydzherdgswift008@gmail.com>
* Arda Güler (WKFO) <ardaguler09@gmail.com>
+5 -54
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python2
from __future__ import print_function
import argparse
@@ -8,25 +8,17 @@ import sys
from renpy import version_tuple # @UnresolvedImport
branch = os.popen("git branch --show-current").read().strip()
SOURCE = [
"/home/tom/ab/renpy",
"/home/tom/ab/renpy-build-" + branch,
"/home/tom/ab/renpy-build",
"/home/tom/ab/pygame_sdl2",
"/home/tom/ab/renpy-build/renpyweb",
]
from renpy.versions import generate_vc_version
version = generate_vc_version()["version"]
short_version = version.rpartition(".")[0]
major = version.partition(".")[0]
version = ".".join(str(i) for i in version_tuple)
short_version = ".".join(str(i) for i in version_tuple[:-1])
print("Version", version)
if major == '7':
SOURCE.append("/home/tom/ab/renpy-build-fix/renpyweb")
ap = argparse.ArgumentParser()
ap.add_argument("--release", action="store_true")
@@ -35,48 +27,9 @@ ap.add_argument("--experimental", action="store_true")
ap.add_argument("--no-tag", "-n", action="store_true")
ap.add_argument("--push-tags", action="store_true")
ap.add_argument("--delete-tag")
ap.add_argument("--github", action="store_true")
ap.add_argument("--real", action="store_true")
args = ap.parse_args()
if not args.real:
print("Did you want to use scripts/add_all.sh? If not, give --real.")
sys.exit(1)
if args.github:
subprocess.call([ "git", "push", "--tags" ])
subprocess.call([ "gh", "release", "create", version, "--notes", "See https://www.renpy.org/release/" + short_version, "-t", "Ren'Py {}".format(short_version) ])
dn = "/home/tom/ab/renpy/dl/" + short_version
for fn in os.listdir(dn):
if fn == ".build_cache":
continue
if fn.endswith(".update.gz"):
continue
if fn.endswith(".update.json"):
continue
if fn.startswith("updates.json"):
continue
if fn.endswith(".zsync"):
continue
if fn.endswith(".sums"):
continue
subprocess.call([ "gh", "release", "upload", version, os.path.join(dn, fn) ])
sys.exit(0)
if args.release:
subprocess.check_call([ "/home/tom/ab/renpy/scripts/checksums.py", "/home/tom/ab/renpy/dl/" + short_version ])
@@ -121,8 +74,6 @@ else:
if args.no_tag:
tag = False
links = [ i + "-" + major for i in links ]
if tag:
for i in SOURCE:
os.chdir(i)
+10
View File
@@ -0,0 +1,10 @@
# This file sets up the normal python modules. It's used to help eclipse
# do type detection, by providing an importable version of the cython code.
from distutils.core import setup
setup(
packages=['renpy', 'renpy.gl', 'renpy.angle', 'renpy.display', 'renpy.audio', 'renpy.text', 'pysdlsound'],
package_dir={ 'pysdlsound' : 'module' },
)
+2
View File
@@ -0,0 +1,2 @@
lib\windows-i686\python.exe -OO renpy.py tutorial
pause
Executable
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
if [ -z "$RENPY_COVERAGE" ]; then
echo "$0 needs to be run with RENPY_COVERAGE set, probably in a virtualenv."
exit 1
fi
./run.sh --build || exit 1
coverage run renpy.py "$@"
coverage html
xdg-open htmlcov/index.html
Executable
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
# This builds out of date modules using the default C compiler, and then
# runs them.
ROOT="$(dirname $(realpath $0))"
export RENPY_GDB="gdb --args"
. "$ROOT/run.sh" "$@"
+60 -102
View File
@@ -1,11 +1,7 @@
#!/home/tom/ab/renpy/lib/py3-linux-x86_64/python
#!/home/tom/ab/renpy/lib/linux-x86_64/python -O
# Builds a distribution of Ren'Py.
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
import future.standard_library
import future.utils
PY2 = future.utils.PY2
from __future__ import print_function
import sys
import os
@@ -14,37 +10,19 @@ import shutil
import subprocess
import argparse
import time
import collections
try:
# reload is built-in in Python 2, in importlib in Python 3
reload
except NameError:
from importlib import reload
except ImportError:
pass
if not sys.flags.optimize:
raise Exception("Optimization disabled.")
ROOT = os.path.dirname(os.path.abspath(__file__))
def zip_rapt_symbols(destination):
"""
Zips up the rapt symbols.
"""
import zipfile
if PY2:
zf = zipfile.ZipFile(destination + "/android-native-symbols.zip", "w", zipfile.ZIP_DEFLATED)
else:
zf = zipfile.ZipFile(destination + "/android-native-symbols.zip", "w", zipfile.ZIP_DEFLATED, compresslevel=3)
for dn, dirs, files in os.walk("rapt/symbols"):
for fn in dirs + files:
fn = os.path.join(dn, fn)
arcname = os.path.relpath(fn, "rapt/symbols")
zf.write(fn, arcname)
zf.close()
def copy_tutorial_file(src, dest):
"""
Copies a file from src to dst. Lines between "# tutorial-only" and
@@ -54,7 +32,7 @@ def copy_tutorial_file(src, dest):
# True if we want to copy the line.
copy = True
with open(src, "r") as sf, open(dest, "w") as df:
with open(src, "rb") as sf, open(dest, "wb") as df:
for l in sf:
if "# tutorial-only" in l:
copy = False
@@ -64,24 +42,14 @@ def copy_tutorial_file(src, dest):
if copy:
df.write(l)
def link_directory(dirname):
dn = os.path.join(ROOT, dirname)
if os.path.exists(dn):
os.unlink(dn)
if PY2:
source = dn + "2"
else:
source = dn + "3"
if os.path.exists(source):
os.symlink(source, dn)
def main():
start = time.time()
if not sys.flags.optimize:
raise Exception("Not running with python optimization.")
ap = argparse.ArgumentParser()
ap.add_argument("version", nargs="?")
ap.add_argument("--fast", action="store_true")
@@ -92,64 +60,56 @@ def main():
ap.add_argument("--nosign", action="store_false", dest="sign")
ap.add_argument("--notarized", action="store_true", dest="notarized")
ap.add_argument("--vc-version-only", action="store_true")
ap.add_argument("--link-directories", action="store_true")
ap.add_argument("--append-version", action="store_true")
ap.add_argument("--nightly", action="store_true")
ap.add_argument("--print-version", action="store_true")
args = ap.parse_args()
link_directory("rapt")
link_directory("renios")
link_directory("web")
import renpy.versions
renpy.versions.generate_vc_version(nightly=args.nightly)
if args.link_directories or args.vc_version_only:
return
if not os.path.abspath(sys.executable).startswith(ROOT + "/lib"):
raise Exception("Distribute must be run with the python in lib/.")
if args.sign:
os.environ["RENPY_MAC_IDENTITY"] = "Developer ID Application: Tom Rothamel (XHTE5H7Z79)"
if PY2 and not sys.flags.optimize:
raise Exception("Not running with python optimization.")
# Revision updating is done early, so we can do it even if the rest
# of the program fails.
try:
vc_version_base = os.path.splitext(renpy.vc_version.__file__)[0]
# Delete the .pyc and .pyo files, as reload can choose one of them instead
# of the new .py file.
for fn in [ vc_version_base + ".pyc", vc_version_base + ".pyo" ]:
if os.path.exists(fn):
os.unlink(fn)
reload(renpy.vc_version)
except Exception:
import renpy.vc_version
# A normal reload is fine, as renpy/__init__.py won't change.
reload(renpy)
if args.print_version:
print(renpy.version_only)
return
# Determine the version. We grab the current revision, and if any
# file has changed, bump it by 1.
import renpy
if args.version is None:
if args.nightly:
args.version = renpy.version_only
else:
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1])
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1]) # @UndefinedVariable
if args.append_version:
args.version += "-" + renpy.version_only
match_version = ".".join(str(i) for i in renpy.version_tuple[:2]) # @UndefinedVariable
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", "--match", "start-" + match_version ])
parts = s.strip().split("-")
if len(parts) <= 3:
vc_version = 0
else:
vc_version = int(parts[2])
if parts[-1] == "dirty":
vc_version += 1
with open("renpy/vc_version.py", "w") as f:
import socket
official = socket.gethostname() == "eileen"
nightly = args.version and "nightly" in args.version
f.write("vc_version = {}\n".format(vc_version))
f.write("official = {}\n".format(official))
f.write("nightly = {}\n".format(nightly))
if args.vc_version_only:
return
try:
reload(sys.modules['renpy.vc_version']) # @UndefinedVariable
except:
import renpy.vc_version # @UnusedImport
reload(sys.modules['renpy'])
# Check that the versions match.
full_version = renpy.version_only # @UndefinedVariable
if "-" not in args.version \
and not full_version.startswith(args.version):
raise Exception("The command-line and Ren'Py versions do not match.")
@@ -167,19 +127,19 @@ def main():
print("Version {} ({})".format(args.version, full_version))
if sys.version_info[0] >= 3:
renpy_sh = "./renpy3.sh"
else:
renpy_sh = "./renpy2.sh"
# Perhaps autobuild.
if "RENPY_BUILD_ALL" in os.environ:
print("Autobuild...")
subprocess.check_call(["scripts/autobuild.sh"])
# Compile all the python files.
compileall.compile_dir("renpy/", ddir="renpy/", force=True, quiet=1)
compileall.compile_dir("renpy/", ddir="renpy/", force=1, quiet=1)
# Compile the various games.
if not args.fast:
for i in [ 'tutorial', 'launcher', 'the_question' ]:
print("Compiling", i)
subprocess.check_call([renpy_sh, i, "compile" ])
subprocess.check_call(["./renpy.sh", i, "quit" ])
# Kick off the rapt build.
if not args.fast:
@@ -188,8 +148,8 @@ def main():
sys.path.insert(0, os.path.join(ROOT, "rapt", "buildlib"))
import rapt.interface # type: ignore
import rapt.build # type: ignore
import rapt.interface # @UnresolvedImport
import rapt.build # @UnresolvedImport
interface = rapt.interface.Interface()
rapt.build.distclean(interface)
@@ -202,12 +162,10 @@ def main():
if not os.path.exists(destination):
os.makedirs(destination)
zip_rapt_symbols(destination)
if args.fast:
cmd = [
renpy_sh,
"./renpy.sh",
"launcher",
"distribute",
"launcher",
@@ -220,7 +178,7 @@ def main():
else:
cmd = [
renpy_sh,
"./renpy.sh",
"launcher",
"distribute",
"launcher",
@@ -252,7 +210,7 @@ def main():
"-q",
"egg_info",
"--tag-build",
"+renpy" + args.version.replace("+", "-"),
"-for-renpy-" + args.version,
"sdist",
"-d",
os.path.abspath(destination)
@@ -281,7 +239,7 @@ def main():
sys.stdout.write("Creating -sdk.7z")
p = subprocess.Popen([ "7z", "a", sdk + ".7z", sdk], stdout=subprocess.PIPE)
for i, _l in enumerate(p.stdout): # type: ignore
for i, _l in enumerate(p.stdout):
if i % 10 != 0:
continue
+1 -7
View File
@@ -11,8 +11,6 @@ init offset = -2
init python:
gui.init(1280, 720)
## Enable checks for invalid or unstable properties in screens or transforms
define config.check_conflicting_properties = True
################################################################################
@@ -328,7 +326,7 @@ define gui.vbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.
define gui.vscrollbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.vslider_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## What to do with unscrollable scrollbars in the game menu. "hide" hides them, while
## What to do with unscrollable scrollbars in the gui. "hide" hides them, while
## None shows them.
define gui.unscrollable = "hide"
@@ -344,9 +342,6 @@ define config.history_length = 250
## at the cost of performance.
define gui.history_height = gui.scale(140)
## Additional space to add between history screen entries.
define gui.history_spacing = 0
## The position, width, and alignment of the label giving the name of the
## speaking character.
define gui.history_name_xpos = gui.scale(155)
@@ -404,7 +399,6 @@ define gui.nvl_thought_xalign = 0.0
define gui.nvl_button_xpos = gui.scale(450)
define gui.nvl_button_xalign = 0.0
## Localization ################################################################
## This controls where a line break is permitted. The default is suitable for
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

+3 -3
View File
@@ -200,9 +200,9 @@ init python:
build.documentation('*.txt')
## A Google Play license key is required to perform in-app purchases.
## It can be found in the Google Play developer console,
## under "Monetize" > "Monetization Setup" > "Licensing".
## A Google Play license key is required to download expansion files and
## perform in-app purchases. It can be found on the "Services & APIs" page
## of the Google Play developer console.
# define build.google_play_key = "..."
+55 -148
View File
@@ -96,6 +96,7 @@ style frame:
## https://www.renpy.org/doc/html/screen_special.html#say
screen say(who, what):
style_prefix "say"
window:
id "window"
@@ -159,7 +160,6 @@ style say_dialogue:
xsize gui.dialogue_width
ypos gui.dialogue_ypos
adjust_spacing False
## Input screen ################################################################
##
@@ -177,7 +177,7 @@ screen input(prompt):
window:
vbox:
xanchor gui.dialogue_text_xalign
xalign gui.dialogue_text_xalign
xpos gui.dialogue_xpos
xsize gui.dialogue_width
ypos gui.dialogue_ypos
@@ -212,6 +212,11 @@ screen choice(items):
textbutton i.caption action i.action
## When this is true, menu captions will be spoken by the narrator. When
## false, menu captions will be displayed as empty buttons.
define config.narrator_menu = True
style choice_vbox is vbox
style choice_button is button
style choice_button_text is button_text
@@ -227,7 +232,7 @@ style choice_button is default:
properties gui.button_properties("choice_button")
style choice_button_text is default:
properties gui.text_properties("choice_button")
properties gui.button_text_properties("choice_button")
## Quick Menu screen ###########################################################
@@ -272,7 +277,7 @@ style quick_button:
properties gui.button_properties("quick_button")
style quick_button_text:
properties gui.text_properties("quick_button")
properties gui.button_text_properties("quick_button")
################################################################################
@@ -337,7 +342,7 @@ style navigation_button:
properties gui.button_properties("navigation_button")
style navigation_button_text:
properties gui.text_properties("navigation_button")
properties gui.button_text_properties("navigation_button")
## Main Menu screen ############################################################
@@ -407,11 +412,11 @@ style main_menu_version:
## This lays out the basic common structure of a game menu screen. It's called
## with the screen title, and displays the background, title, and navigation.
##
## The scroll parameter can be None, or one of "viewport" or "vpgrid".
## This screen is intended to be used with one or more children, which are
## The scroll parameter can be None, or one of "viewport" or "vpgrid". When
## this screen is intended to be used with one or more children, which are
## transcluded (placed) inside it.
screen game_menu(title, scroll=None, yinitial=0.0, spacing=0):
screen game_menu(title, scroll=None, yinitial=0.0):
style_prefix "game_menu"
@@ -444,8 +449,6 @@ screen game_menu(title, scroll=None, yinitial=0.0, spacing=0):
side_yfill True
vbox:
spacing spacing
transclude
elif scroll == "vpgrid":
@@ -461,8 +464,6 @@ screen game_menu(title, scroll=None, yinitial=0.0, spacing=0):
side_yfill True
spacing spacing
transclude
else:
@@ -649,42 +650,27 @@ screen file_slots(title):
key "save_delete" action FileDelete(slot)
## Buttons to access other pages.
vbox:
hbox:
style_prefix "page"
xalign 0.5
yalign 1.0
hbox:
xalign 0.5
spacing gui.page_spacing
spacing gui.page_spacing
textbutton _("<") action FilePagePrevious()
textbutton _("<") action FilePagePrevious()
key "save_page_prev" action FilePagePrevious()
if config.has_autosave:
textbutton _("{#auto_page}A") action FilePage("auto")
if config.has_autosave:
textbutton _("{#auto_page}A") action FilePage("auto")
if config.has_quicksave:
textbutton _("{#quick_page}Q") action FilePage("quick")
if config.has_quicksave:
textbutton _("{#quick_page}Q") action FilePage("quick")
## range(1, 10) gives the numbers from 1 to 9.
for page in range(1, 10):
textbutton "[page]" action FilePage(page)
## range(1, 10) gives the numbers from 1 to 9.
for page in range(1, 10):
textbutton "[page]" action FilePage(page)
textbutton _(">") action FilePageNext()
key "save_page_next" action FilePageNext()
if config.has_sync:
if CurrentScreenName() == "save":
textbutton _("Upload Sync"):
action UploadSync()
xalign 0.5
else:
textbutton _("Download Sync"):
action DownloadSync()
xalign 0.5
textbutton _(">") action FilePageNext()
style page_label is gui_label
@@ -702,7 +688,7 @@ style page_label:
ypadding gui.scale(3)
style page_label_text:
textalign 0.5
text_align 0.5
layout "subtitle"
hover_color gui.hover_color
@@ -710,13 +696,13 @@ style page_button:
properties gui.button_properties("page_button")
style page_button_text:
properties gui.text_properties("page_button")
properties gui.button_text_properties("page_button")
style slot_button:
properties gui.button_properties("slot_button")
style slot_button_text:
properties gui.text_properties("slot_button")
properties gui.button_text_properties("slot_button")
## Preferences screen ##########################################################
@@ -745,6 +731,13 @@ screen preferences():
textbutton _("Window") action Preference("display", "window")
textbutton _("Fullscreen") action Preference("display", "fullscreen")
vbox:
style_prefix "radio"
label _("Rollback Side")
textbutton _("Disable") action Preference("rollback side", "disable")
textbutton _("Left") action Preference("rollback side", "left")
textbutton _("Right") action Preference("rollback side", "right")
vbox:
style_prefix "check"
label _("Skip")
@@ -851,7 +844,7 @@ style radio_button:
foreground "gui/button/radio_[prefix_]foreground.png"
style radio_button_text:
properties gui.text_properties("radio_button")
properties gui.button_text_properties("radio_button")
style check_vbox:
spacing gui.pref_button_spacing
@@ -861,7 +854,7 @@ style check_button:
foreground "gui/button/check_[prefix_]foreground.png"
style check_button_text:
properties gui.text_properties("check_button")
properties gui.button_text_properties("check_button")
style slider_slider:
xsize gui.scale(350)
@@ -872,7 +865,7 @@ style slider_button:
left_margin gui.scale(10)
style slider_button_text:
properties gui.text_properties("slider_button")
properties gui.button_text_properties("slider_button")
style slider_vbox:
xsize gui.scale(450)
@@ -893,7 +886,7 @@ screen history():
## Avoid predicting this screen, as it can be very large.
predict False
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0, spacing=gui.history_spacing):
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0):
style_prefix "history"
@@ -926,7 +919,7 @@ screen history():
## This determines what tags are allowed to be displayed on the history
## screen.
define gui.history_allow_tags = { "alt", "noalt", "rt", "rb", "art" }
define gui.history_allow_tags = { "alt", "noalt" }
style history_window is empty
@@ -935,6 +928,8 @@ style history_name is gui_label
style history_name_text is gui_label_text
style history_text is gui_text
style history_text is gui_text
style history_label is gui_label
style history_label_text is gui_label_text
@@ -950,7 +945,7 @@ style history_name:
style history_name_text:
min_width gui.history_name_width
textalign gui.history_name_xalign
text_align gui.history_name_xalign
style history_text:
xpos gui.history_text_xpos
@@ -958,7 +953,7 @@ style history_text:
xanchor gui.history_text_xalign
xsize gui.history_text_width
min_width gui.history_text_width
textalign gui.history_text_xalign
text_align gui.history_text_xalign
layout ("subtitle" if gui.history_text_xalign else "tex")
style history_label:
@@ -1069,7 +1064,7 @@ screen mouse_help():
text _("Accesses the game menu.")
hbox:
label _("Mouse Wheel Up")
label _("Mouse Wheel Up\nClick Rollback Side")
text _("Rolls back to earlier dialogue.")
hbox:
@@ -1091,12 +1086,13 @@ screen gamepad_help():
label _("Right Shoulder")
text _("Rolls forward to later dialogue.")
hbox:
label _("D-Pad, Sticks")
text _("Navigate the interface.")
hbox:
label _("Start, Guide, B/Right Button")
label _("Start, Guide")
text _("Accesses the game menu.")
hbox:
@@ -1117,7 +1113,7 @@ style help_button:
xmargin gui.scale(8)
style help_button_text:
properties gui.text_properties("help_button")
properties gui.button_text_properties("help_button")
style help_label:
xsize gui.scale(250)
@@ -1126,7 +1122,7 @@ style help_label:
style help_label_text:
size gui.text_size
xalign 1.0
textalign 1.0
text_align 1.0
@@ -1188,14 +1184,14 @@ style confirm_frame:
yalign .5
style confirm_prompt_text:
textalign 0.5
text_align 0.5
layout "subtitle"
style confirm_button:
properties gui.button_properties("confirm_button")
style confirm_button_text:
properties gui.text_properties("confirm_button")
properties gui.button_text_properties("confirm_button")
## Skip indicator screen #######################################################
@@ -1322,7 +1318,7 @@ screen nvl(dialogue, items=None):
use nvl_dialogue(dialogue)
## Displays the menu, if given. The menu may be displayed incorrectly
## if config.narrator_menu is set to True.
## if config.narrator_menu is set to True, as it is above.
for i in items:
textbutton i.caption:
@@ -1382,7 +1378,7 @@ style nvl_label:
yanchor 0.0
xsize gui.nvl_name_width
min_width gui.nvl_name_width
textalign gui.nvl_name_xalign
text_align gui.nvl_name_xalign
style nvl_dialogue:
xpos gui.nvl_text_xpos
@@ -1390,7 +1386,7 @@ style nvl_dialogue:
ypos gui.nvl_text_ypos
xsize gui.nvl_text_width
min_width gui.nvl_text_width
textalign gui.nvl_text_xalign
text_align gui.nvl_text_xalign
layout ("subtitle" if gui.nvl_text_xalign else "tex")
style nvl_thought:
@@ -1399,7 +1395,7 @@ style nvl_thought:
ypos gui.nvl_thought_ypos
xsize gui.nvl_thought_width
min_width gui.nvl_thought_width
textalign gui.nvl_thought_xalign
text_align gui.nvl_thought_xalign
layout ("subtitle" if gui.nvl_text_xalign else "tex")
style nvl_button:
@@ -1408,96 +1404,7 @@ style nvl_button:
xanchor gui.nvl_button_xalign
style nvl_button_text:
properties gui.text_properties("nvl_button")
## Bubble screen ###############################################################
##
## The bubble screen is used to display dialogue to the player when using
## speech bubbles. The bubble screen takes the same parameters as the say
## screen, must create a displayable with the id of "what", and can create
## displayables with the "namebox", "who", and "window" ids.
##
## https://www.renpy.org/doc/html/bubble.html#bubble-screen
screen bubble(who, what):
style_prefix "bubble"
window:
id "window"
if who is not None:
window:
id "namebox"
style "bubble_namebox"
text who:
id "who"
text what:
id "what"
style bubble_window is empty
style bubble_namebox is empty
style bubble_who is default
style bubble_what is default
style bubble_window:
xpadding 30
top_padding 5
bottom_padding 5
style bubble_namebox:
xalign 0.5
style bubble_who:
xalign 0.5
textalign 0.5
color "#000"
style bubble_what:
align (0.5, 0.5)
text_align 0.5
layout "subtitle"
color "#000"
define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)
define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55)
define bubble.properties = {
"bottom_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
"window_bottom_padding" : 27,
},
"bottom_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
"window_bottom_padding" : 27,
},
"top_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
"window_top_padding" : 27,
},
"top_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
"window_top_padding" : 27,
},
"thought" : {
"window_background" : bubble.thoughtframe,
}
}
define bubble.expand_area = {
"bottom_left" : (0, 0, 0, 22),
"bottom_right" : (0, 0, 0, 22),
"top_left" : (0, 22, 0, 0),
"top_right" : (0, 22, 0, 0),
"thought" : (0, 0, 0, 0),
}
properties gui.button_text_properties("nvl_button")
+178
View File
@@ -0,0 +1,178 @@
<html>
<head>
<title>README</title>
<style>
BODY {
background: #fff;
color: #444;
padding-left: 20%;
padding-top: 1em;
padding-bottom: 1em;
padding-right: 20%;
font-family: sans-serif;
line-height: 1.6em;
}
DT {
font-weight: bold;
margin-top: .33em;
}
H2 {
color: #000;
margin-left: -2.5em;
}
H3 {
color: #000;
margin-left: -1.5em;
}
.editsection {
display: none;
}
</style>
</head>
<body>
<h2>Basic Help</h2>
<p>
To advance through the game, <tt>left-click</tt> or press the <tt>space</tt> or <tt>enter</tt> keys. When at a menu,
<tt>left-click</tt> to make a choice, or use the arrow keys to select a choice and <tt>enter</tt> to activate it.
</p>
<h3>Game Menu</h3>
<p>
When playing a game, <tt>right-click</tt> or press the <tt>escape</tt> key to enter the game menu. The game menu
gives the following choices:
</p>
<dl>
<dt>Return</dt>
<dd>Returns to the game.</dd>
<dt>Save Game</dt>
<dd>Allows you to save a game by clicking on a save slot.</dd>
<dt>Load Game</dt>
<dd>Allows you to load a game by clicking on a save slot. Clicking on "Auto" accesses the automatic save slots.</dd>
<dt>Preferences</dt>
<dd>
Changes the game preferences (options/configuration):
<dl>
<dt>Display</dt>
<dd>Switches between fullscreen and windowed mode.</dd>
<dt>Transitions</dt>
<dd>Controls the display of transitions between game screens.</dd>
<dt>Text Speed</dt>
<dd>Controls the rate at which text displays. The further to the right this slider is, the faster the text
will display. All the way to the right causes text to be shown instantly.</dd>
<dt>Joystick</dt>
<dd>Lets you control the game using a joystick.</dd>
<dt>Skip</dt>
<dd>Chooses between skipping messages that have been already seen (in any play through the game), and
skipping all messages.</dd>
<dt>Begin Skipping</dt>
<dd>Returns to the game, while skipping.</dd>
<dt>After Choices</dt>
<dd>Controls if skipping stops upon reaching a menu.</dd>
<dt>Auto-Forward Time</dt>
<dd>Controls automatic advance. The further to the left this slider is, the shorter the amount of time
before the game advances. All the way to the right means text will never auto-forward.</dd>
<dt>Music, Sound, and Voice Volume</dt>
<dd>Controls the volume of the Music, Sound effect, and Voice channels, respectively. The further to the
right these are, the louder the volume.</dd>
</dl>
</dd>
<dt>Main Menu</dt>
<dd>Returns to the main menu, ending the current game.</dd>
<dt>Help</dt>
<dd>Shows this help screen.</dd>
<dt>Quit</dt>
<dd>Exits the game; the game will be closed and ended.</dd>
</dl>
<h3>Key and Mouse Bindings</h3>
<dl>
<dt>Left-click, Enter</dt>
<dd>Advances through the game, activates menu choices, buttons, and sliders.</dd>
<dt>Space</dt>
<dd>Advances through the game, but does not activate choices.</dd>
<dt>Arrow Keys</dt>
<dd>Navigates between menu choices, buttons, and sliders.</dd>
<dt>Ctrl</dt>
<dd>Causes skipping to occur while the ctrl key is held down.</dd>
<dt>Tab</dt>
<dd>Toggles skipping, causing it to occur until tab is pressed again.</dd>
<dt>Mousewheel-Up, PageUp</dt>
<dd>Causes rollback to occur. Rollback reverses the game back in time, showing prior text and even allowing
menu choices to be changed.</dd>
<dt>Mousewheel-Down, PageDown</dt>
<dd>Causes rollforward to occur, canceling out a previous rollback.</dd>
<dt>Right-click, Escape</dt>
<dd>Enters the game menu. When in the game menu, returns to the game.</dd>
<dt>Middle-click, H</dt>
<dd>Hides the text window and other transient displays.</dd>
<dt>F</dt>
<dd>Toggles fullscreen mode</dd>
<dt>S</dt>
<dd>Takes a screenshot, saving it in a file named screenshotxxxx.png, where xxxx is a serial number.</dd>
<dt>Alt-M, Command-H</dt>
<dd>Hides (iconifies) the window.</dd>
<dt>Alt-F4, Command-Q</dt>
<dd>Quits the game.</dd>
<dt>Delete</dt>
<dd>When a save slot is selected, deletes that save slot.</dd>
<dt>v</dt>
<dd>
Toggles self-voicing mode, which reads text to the user using an os-supplied speech synthesizer. For more
information, please read the <a href="https://www.renpy.org/doc/html/self_voicing.html">self-voicing</a>
documentation.
</dd>
<dt>Shift+C</dt>
<dd>Toggles clipboard-voicing mode, which copies text to the clipboard so it can be read by a screen reader.</dd>
</dl>
<h3>Controller Support and Bindings</h3>
<p>
This game should automatically detect and use game controllers supported by
SDL2. Other controllers can be configured using third-party configuration tools
like the <a href="http://www.generalarcade.com/gamepadtool/">SDL2 Gampad Tool</a>
</p>
<p>
A small number of systems may have problems using detected game controllers. Should
that happen, hold down shift as the game starts, and disable the controller support.
</p>
<p>The following bindings are used:</p>
<dl>
<dt>Right Trigger, A (Bottom Button)</dt>
<dd>Advances through the game, activates menu choices, buttons, and sliders.</dd>
<dt>Guide, Start</dt>
<dd>Enters the game menu. When in the game menu, returns to the game.</dd>
<dt>Directional Pad, Analog Sticks</dt>
<dd>Navigates between menu choices, buttons, and sliders.</dd>
<dt>Left Trigger, Left Shoulder, Back</dt>
<dd>Causes rollback to occur. Rollback reverses the game back in time, showing prior text and even allowing
menu choices to be changed.</dd>
<dt>Right Shoulder</dt>
<dd>Causes rollforward to occur, canceling out a previous rollback.</dd>
<dt>Y (Top Button)</dt>
<dd>Hides the text window and other transient displays.</dd>
</dl>
<h2>Legal Notice</h2>
<p>
This program contains free software licensed under a number of licenses, including the GNU Lesser Public License. A
complete list of software is available at <a href="https://www.renpy.org/doc/html/license.html">https://www.renpy.org/doc/html/license.html</a>.
</p>
</body>
</html>
-86
View File
@@ -1,86 +0,0 @@
#!/usr/bin/env python
# The path to a copy of Atom that's been installed globally, if one exists.
# This is overidden by RENPY_ATOM, if set. If either is given, that is used
# and no special handing of the .atom directory is performed.
ATOM = None
import sys
import os
import subprocess
import platform
import shutil
import renpy
class Editor(renpy.editor.Editor):
has_projects = True
def get_atom(self):
"""
Returns the path to the atom executable, if None. Also takes care
of setting up the .atom directory if it's not available.
"""
atom = os.environ.get("RENPY_ATOM", ATOM)
if atom is not None:
return atom
DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
DIR = os.path.join(renpy.exports.fsdecode(DIR), "atom")
if renpy.windows:
atom = os.path.join(DIR, "atom-windows", "atom.exe")
elif renpy.macintosh:
atom = os.path.join(DIR, "Atom.app", "Contents", "Resources", "app", "atom.sh")
else:
atom = os.path.join(DIR, "atom-linux-" + platform.machine(), "atom")
default_dot_atom = os.path.join(DIR, "default-dot-atom")
dot_atom = os.path.join(DIR, ".atom")
if not os.path.exists(dot_atom) and os.path.exists(default_dot_atom):
shutil.copytree(default_dot_atom, dot_atom)
return atom
def begin(self, new_window=False, **kwargs):
self.args = [ ]
def open(self, filename, line=None, **kwargs):
if line:
filename = "{}:{}".format(filename, line)
self.args.append(filename)
def open_project(self, project):
self.args.append(project)
def end(self, **kwargs):
atom = self.get_atom()
self.args.reverse()
args = [ atom ] + self.args
args = [ renpy.exports.fsencode(i) for i in args ]
subprocess.Popen(args)
def main():
e = Editor()
e.begin()
for i in sys.argv[1:]:
e.open(i)
e.end()
if __name__ == "__main__":
main()
@@ -1,93 +0,0 @@
import os
import subprocess
import sys
import renpy
class Editor(renpy.editor.Editor):
has_projects = True
system = __file__.endswith(" (System).edit.py")
def get_code(self):
"""
Returns the path to the code executable.
"""
if self.system:
if "RENPY_VSCODE" in os.environ:
return os.environ["RENPY_VSCODE"]
if renpy.windows:
return "code.cmd"
if renpy.macintosh and os.path.exists("/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"):
return "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"
return "code"
else:
RENPY_VSCODE = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "vscode"))
if renpy.windows:
code = os.path.join(RENPY_VSCODE, "VSCode-win32-x64", "bin", "code.cmd")
elif renpy.macintosh:
code = os.path.join(RENPY_VSCODE, "Visual Studio Code.app", "Contents", "Resources", "app", "bin", "code")
elif renpy.linux:
if renpy.arch == "aarch64":
arch = "arm64"
elif renpy.arch == "armv7l":
arch = "arm"
else:
arch = "x64"
code = os.path.join(RENPY_VSCODE, "VSCode-linux-" + arch, "bin", "code")
else:
code = "code"
return code
def open(self, filename, line=None, **kwargs):
if line:
filename = "{}:{}".format(filename, line)
self.args.append(filename)
def open_project(self, project):
self.args.append(project)
def begin(self, new_window=False, **kwargs):
self.args = [ ]
def end(self, **kwargs):
self.args.reverse()
code = self.get_code()
if self.system or not renpy.linux:
args = [ code, "-g" ] + self.args
else:
args = [ code, "--no-sandbox", "-g" ] + self.args
args = [ renpy.exports.fsencode(i) for i in args ]
if renpy.windows:
CREATE_NO_WINDOW = 0x08000000
subprocess.Popen(args, creationflags=CREATE_NO_WINDOW)
else:
subprocess.Popen(args)
def main():
e = Editor()
e.begin()
for i in sys.argv[1:]:
e.open(i)
e.end()
if __name__ == "__main__":
main()
-93
View File
@@ -1,93 +0,0 @@
import os
import subprocess
import sys
import renpy
class Editor(renpy.editor.Editor):
has_projects = True
system = __file__.endswith(" (System).edit.py")
def get_code(self):
"""
Returns the path to the code executable.
"""
if self.system:
if "RENPY_VSCODE" in os.environ:
return os.environ["RENPY_VSCODE"]
if renpy.windows:
return "code.cmd"
if renpy.macintosh and os.path.exists("/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"):
return "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"
return "code"
else:
RENPY_VSCODE = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "vscode"))
if renpy.windows:
code = os.path.join(RENPY_VSCODE, "VSCode-win32-x64", "bin", "code.cmd")
elif renpy.macintosh:
code = os.path.join(RENPY_VSCODE, "Visual Studio Code.app", "Contents", "Resources", "app", "bin", "code")
elif renpy.linux:
if renpy.arch == "aarch64":
arch = "arm64"
elif renpy.arch == "armv7l":
arch = "arm"
else:
arch = "x64"
code = os.path.join(RENPY_VSCODE, "VSCode-linux-" + arch, "bin", "code")
else:
code = "code"
return code
def open(self, filename, line=None, **kwargs):
if line:
filename = "{}:{}".format(filename, line)
self.args.append(filename)
def open_project(self, project):
self.args.append(project)
def begin(self, new_window=False, **kwargs):
self.args = [ ]
def end(self, **kwargs):
self.args.reverse()
code = self.get_code()
if self.system or not renpy.linux:
args = [ code, "-g" ] + self.args
else:
args = [ code, "--no-sandbox", "-g" ] + self.args
args = [ renpy.exports.fsencode(i) for i in args ]
if renpy.windows:
CREATE_NO_WINDOW = 0x08000000
subprocess.Popen(args, creationflags=CREATE_NO_WINDOW)
else:
subprocess.Popen(args)
def main():
e = Editor()
e.begin()
for i in sys.argv[1:]:
e.open(i)
e.end()
if __name__ == "__main__":
main()
+144
View File
@@ -0,0 +1,144 @@
import binascii
def a2b(a):
return binascii.a2b_hex(''.join(a.split()))
resources = {
260 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 c8 00 c0 80
02 00 00 00 00 00 b8 00 29 00 00 00 00 00 00 00
08 00 90 01 00 01 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 01 00 01 50 7f 00 14 00
32 00 0e 00 01 00 00 00 ff ff 80 00 4f 00 4b 00
00 00 00 00 00 00 00 00 00 00 00 00 04 08 00 50
07 00 07 00 aa 00 0c 00 ea 03 00 00 ff ff 81 00
00 00 00 00
'''),
261 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 c8 00 c0 80
04 00 00 00 00 00 b8 00 3a 00 00 00 00 00 00 00
08 00 90 01 00 01 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 80 00 81 50 07 00 14 00
aa 00 0c 00 ec 03 00 00 ff ff 81 00 00 00 00 00
00 00 00 00 00 00 00 00 01 00 01 50 7f 00 25 00
32 00 0e 00 01 00 00 00 ff ff 80 00 4f 00 4b 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 50
4a 00 25 00 32 00 0e 00 02 00 00 00 ff ff 80 00
43 00 61 00 6e 00 63 00 65 00 6c 00 00 00 00 00
00 00 00 00 00 00 00 00 04 08 00 50 07 00 07 00
aa 00 0c 00 eb 03 00 00 ff ff 81 00 00 00 00 00
'''),
262 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 c8 00 c0 80
04 00 00 00 00 00 b8 00 29 00 00 00 00 00 00 00
08 00 90 01 00 01 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 00 00 01 50 7f 00 14 00
32 00 0e 00 06 00 00 00 ff ff 80 00 59 00 65 00
73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04 08 00 50 07 00 07 00 aa 00 0c 00 ed 03 00 00
ff ff 81 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 50 07 00 14 00 32 00 0e 00 07 00 00 00
ff ff 80 00 4e 00 6f 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 01 50 4b 00 14 00 32 00 0e 00
02 00 00 00 ff ff 80 00 43 00 61 00 6e 00 63 00
65 00 6c 00 00 00 00 00
'''),
263 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 80 00 ca 80
03 00 00 00 00 00 e2 00 29 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 81 50 07 00 14 00
97 00 0e 00 eb 03 00 00 6d 00 73 00 63 00 74 00
6c 00 73 00 5f 00 70 00 72 00 6f 00 67 00 72 00
65 00 73 00 73 00 33 00 32 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 04 08 00 50 07 00 07 00
d4 00 0c 00 ea 03 00 00 ff ff 81 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 50 a9 00 14 00
32 00 0e 00 02 00 00 00 ff ff 80 00 43 00 61 00
6e 00 63 00 65 00 6c 00 00 00 00 00
'''),
264 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 c8 00 c0 80
04 00 00 00 00 00 b8 00 3a 00 00 00 00 00 00 00
08 00 90 01 00 01 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 a0 00 81 50 07 00 14 00
aa 00 0c 00 ec 03 00 00 ff ff 81 00 00 00 00 00
00 00 00 00 00 00 00 00 01 00 01 50 7f 00 25 00
32 00 0e 00 01 00 00 00 ff ff 80 00 4f 00 4b 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 50
4a 00 25 00 32 00 0e 00 02 00 00 00 ff ff 80 00
43 00 61 00 6e 00 63 00 65 00 6c 00 00 00 00 00
00 00 00 00 00 00 00 00 04 08 00 50 07 00 07 00
aa 00 0c 00 eb 03 00 00 ff ff 81 00 00 00 00 00
'''),
265 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 c8 00 c8 80
12 00 00 00 00 00 d9 00 fc 00 00 00 00 00 00 00
08 00 90 01 00 01 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 01 00 01 50 6c 00 ea 00
30 00 0e 00 01 00 00 00 ff ff 80 00 4f 00 4b 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 50
a2 00 ea 00 30 00 0e 00 02 00 00 00 ff ff 80 00
43 00 61 00 6e 00 63 00 65 00 6c 00 00 00 00 00
00 00 00 00 00 00 00 00 07 00 00 50 06 00 06 00
cc 00 4e 00 ff ff ff ff ff ff 80 00 00 00 00 00
00 00 00 00 00 00 00 00 03 00 21 50 48 00 12 00
84 00 64 00 03 00 00 00 ff ff 85 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 02 50 0c 00 24 00
c0 00 08 00 04 00 00 00 ff ff 82 00 00 00 00 00
00 00 00 00 00 00 00 00 80 00 81 50 0c 00 30 00
c0 00 0e 00 05 00 00 00 ff ff 81 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 01 50 9c 00 42 00
30 00 0e 00 06 00 00 00 ff ff 80 00 41 00 64 00
64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
07 00 00 50 06 00 54 00 cb 00 3c 00 ff ff ff ff
ff ff 80 00 00 00 00 00 00 00 00 00 00 00 00 00
03 00 21 50 48 00 61 00 84 00 64 00 07 00 00 00
ff ff 85 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 02 50 0c 00 72 00 c0 00 08 00 08 00 00 00
ff ff 82 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 50 9c 00 7e 00 30 00 0e 00 09 00 00 00
ff ff 80 00 41 00 64 00 64 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 01 50 06 00 96 00
42 00 0e 00 0a 00 00 00 ff ff 80 00 41 00 64 00
64 00 20 00 66 00 69 00 6c 00 65 00 2e 00 2e 00
2e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 50 4e 00 96 00 42 00 0e 00 0b 00 00 00
ff ff 80 00 41 00 64 00 64 00 20 00 6e 00 65 00
77 00 20 00 66 00 69 00 6c 00 65 00 2e 00 2e 00
2e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 50 06 00 a8 00 42 00 0e 00 0c 00 00 00
ff ff 80 00 41 00 64 00 64 00 20 00 66 00 6f 00
6c 00 64 00 65 00 72 00 2e 00 2e 00 2e 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 50
06 00 c6 00 cc 00 1e 00 ff ff ff ff ff ff 80 00
43 00 6f 00 6d 00 6d 00 61 00 6e 00 64 00 20 00
6c 00 69 00 6e 00 65 00 3a 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 80 00 81 50 0c 00 d2 00
c0 00 0e 00 0e 00 00 00 ff ff 81 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 02 50 0c 00 14 00
3c 00 08 00 1e 00 00 00 ff ff 82 00 4f 00 70 00
74 00 69 00 6f 00 6e 00 3a 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 02 50 0c 00 63 00
3c 00 08 00 46 00 00 00 ff ff 82 00 43 00 6f 00
6d 00 6d 00 61 00 6e 00 64 00 3a 00 00 00 00 00
'''),
270 : a2b('''
01 00 ff ff 00 00 00 00 00 00 00 00 48 04 00 44
02 00 00 00 00 00 23 01 1a 00 00 00 00 00 00 00
08 00 00 00 00 00 4d 00 53 00 20 00 53 00 68 00
65 00 6c 00 6c 00 20 00 44 00 6c 00 67 00 00 00
00 00 00 00 00 00 00 00 01 00 02 50 00 00 07 00
23 01 08 00 ff ff ff ff ff ff 82 00 53 00 74 00
61 00 74 00 69 00 63 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 02 40 00 00 12 00 23 01 08 00
5f 04 00 00 ff ff 82 00 73 00 74 00 63 00 33 00
32 00 00 00 00 00
'''),
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -54,7 +54,7 @@ label add_file:
try:
os.makedirs(dir)
except Exception:
except:
pass
contents = u"\uFEFF"
+45 -142
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -31,22 +31,22 @@ init python:
ANDROID_NO_BUNDLE = 6
ANDROID_OK = 7
JDK_REQUIREMENT = 42
NO_RAPT_TEXT = _("To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher.")
NO_JDK_TEXT = _("A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher.")
NO_SDK_TEXT = _("RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this.")
NO_KEY_TEXT = _("RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory.")
NO_KEY_TEXT = _("RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore.")
NO_BUNDLE_KEY_TEXT = _("RAPT has been installed, but a bundle key hasn't been configured. Please create a new key, or restore bundle.keystore.")
NO_CONFIG_TEXT = _("The current project has not been configured. Use \"Configure\" to configure it before building.")
NO_BUNDLE_TEXT = _("Please select if you want a Play Bundle (for Google Play), or a Universal APK (for sideloading and other app stores).")
OK_TEXT = _("Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device.")
PHONE_TEXT = _("Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button.")
TABLET_TEXT = _("Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button.")
OUYA_TEXT = _("Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button.")
OUYA_TEXT = _("Attempts to emulate a televison-based Android console, like the OUYA or Fire TV.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button.")
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages.")
GENERATE_KEYS_TEXT = _("Generates the keys required to sign the package.")
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package.")
CONFIGURE_TEXT = _("Configures the package name, version, and other information about this project.")
PLAY_KEYS_TEXT = _("Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details.")
BUILD_TEXT = _("Builds the Android package.")
BUILD_AND_INSTALL_TEXT = _("Builds the Android package, and installs it on an Android device connected to your computer.")
BUILD_INSTALL_AND_LAUNCH_TEXT = _("Builds the Android package, installs it on an Android device connected to your computer, then launches the app on your device.")
@@ -57,11 +57,10 @@ init python:
CONNECT_TEXT = _("Connects to a device over Wi-Fi, on Android 11+.")
DISCONNECT_TEXT = _("Disconnects a device connected over Wi-Fi.")
CLEAN_TEXT = _("Removes Android temporary files.")
PLAY_BUNDLE_TEXT = _("Builds an Android App Bundle (ABB), intended to be uploaded to Google Play. This can include up to 2GB of data.")
UNIVERSAL_APK_TEXT = _("Builds a Universal APK package, intended for sideloading and stores other than Google Play. This can include up to 2GB of data.")
import subprocess
import re
import os
@@ -93,17 +92,13 @@ init python:
import rapt.install_sdk
import rapt.plat
import rapt.interface
import rapt.keys
rapt.plat.renpy = True
rapt.plat.translate = __
JDK_REQUIREMENT = rapt.plat.jdk_requirement
else:
rapt = None
def AndroidState():
"""
Determines the state of the android install, and returns it.
@@ -111,14 +106,15 @@ init python:
if RAPT_PATH is None:
return ANDROID_NO_RAPT
if renpy.windows and not "JAVA_HOME" in os.environ:
return ANDROID_NO_JDK
if not os.path.exists(rapt.plat.adb):
return ANDROID_NO_SDK
if not rapt.keys.keys_exist(project.current.path):
if not os.path.exists(rapt.plat.path("project/local.properties")):
return ANDROID_NO_KEY
if not any([
os.path.exists(os.path.join(project.current.path, "android.json")),
os.path.exists(os.path.join(project.current.path, ".android.json"))
]):
if not os.path.exists(rapt.plat.path("project/bundle.properties")):
return ANDROID_NO_BUNDLE_KEY
if not os.path.exists(os.path.join(project.current.path, ".android.json")):
return ANDROID_NO_CONFIG
if persistent.android_bundle is None:
return ANDROID_NO_BUNDLE
@@ -133,10 +129,14 @@ init python:
if state == ANDROID_NO_RAPT:
return NO_RAPT_TEXT
if state == ANDROID_NO_JDK:
return NO_JDK_TEXT
if state == ANDROID_NO_SDK:
return NO_SDK_TEXT
if state == ANDROID_NO_KEY:
return NO_KEY_TEXT
if state == ANDROID_NO_BUNDLE_KEY:
return NO_BUNDLE_KEY_TEXT
if state == ANDROID_NO_CONFIG:
return NO_CONFIG_TEXT
if state == ANDROID_NO_BUNDLE:
@@ -179,26 +179,34 @@ init python:
build = p.dump["build"]
c = rapt.configure.Configuration(p.path)
filename = os.path.join(p.path, ".android.json")
with open(filename, "rb") as f:
android_json = json.load(f)
old_android_json = dict(android_json)
if "google_play_key" in build:
c.google_play_key = build["google_play_key"]
android_json["google_play_key"] = build["google_play_key"]
else:
c.google_play_key = None
android_json.pop("google_play_key", None)
if "google_play_salt" in build:
if len(build["google_play_salt"]) != 20:
raise Exception("build.google_play_salt must be exactly 20 bytes long.")
c.google_play_salt = ", ".join(str(i) for i in build["google_play_salt"])
android_json["google_play_salt"] = ", ".join(str(i) for i in build["google_play_salt"])
else:
c.google_play_salt = None
android_json.pop("google_play_salt", None)
c.save(p.path)
if android_json != old_android_json:
with open(filename, "wb") as f:
json.dump(android_json, f)
def android_build(p=None, gui=True, bundle=False, install=False, launch=False, destination=None, opendir=False, packages=None):
def android_build(p=None, gui=True, bundle=False, install=False, launch=False, destination=None, opendir=False):
"""
This actually builds the package.
"""
@@ -220,12 +228,9 @@ init python:
reporter = distribute.TextReporter()
rapt_interface = rapt.interface.Interface()
if not packages:
packages = ['android']
distribute.Distributor(p,
reporter=reporter,
packages=packages,
packages=[ 'android' ],
build_update=False,
noarchive=True,
packagedest=dist,
@@ -249,7 +254,7 @@ init python:
parent = os.path.dirname(p.path)
destination_dir = os.path.join(parent, destination)
except Exception:
except:
destination_dir = None
dir_to_open = source_dir
@@ -260,7 +265,7 @@ init python:
try:
os.makedirs(destination_dir)
except Exception:
except:
pass
try:
@@ -270,27 +275,17 @@ init python:
dir_to_open = destination_dir
except Exception:
except:
import traceback
traceback.print_exc()
pass
if opendir:
dir_to_open = os.path.join(p.path, dir_to_open)
renpy.run(store.OpenDirectory(dir_to_open, absolute=True))
store.OpenDirectory(dir_to_open)()
with interface.nolinks():
rapt.build.build(
rapt_interface,
dist,
p.path,
bundle=bundle,
install=install,
launch=launch,
finished=finished,
permissions=p.dump['build']['android_permissions'],
version=p.dump['build']['version'])
rapt.build.build(rapt_interface, dist, bundle=bundle, install=install, launch=launch, finished=finished, permissions=p.dump['build']['android_permissions'])
def android_build_argument(cmd):
@@ -390,16 +385,12 @@ screen android:
frame style "l_indent":
has vbox
textbutton _("Install SDK"):
textbutton _("Install SDK & Create Keys"):
action AndroidIfState(state, ANDROID_NO_SDK, Jump("android_installsdk"))
hovered tt.Action(INSTALL_SDK_TEXT)
textbutton _("Generate Keys"):
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_keys"))
hovered tt.Action(GENERATE_KEYS_TEXT)
textbutton _("Configure"):
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_configure"))
action AndroidIfState(state, ANDROID_NO_CONFIG, Jump("android_configure"))
hovered tt.Action(CONFIGURE_TEXT)
add SPACER
@@ -428,9 +419,9 @@ screen android:
action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build_install_and_launch"))
hovered tt.Action(BUILD_INSTALL_AND_LAUNCH_TEXT)
add SPACER
# add SPACER
# add SEPARATOR2
textbutton _("Force Recompile") action DataToggle("force_recompile") style "l_checkbox"
# Right side.
@@ -475,9 +466,7 @@ screen android:
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_disconnect"))
hovered tt.Action(DISCONNECT_TEXT)
textbutton _("Clean"):
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_clean"))
hovered tt.Action(CLEAN_TEXT)
add SPACER
add SEPARATOR2
@@ -515,14 +504,6 @@ label android_installsdk:
jump android
label android_keys:
python:
rapt.keys.generate_keys(MobileInterface("android"), project.current.path)
jump android
label android_configure:
python:
@@ -632,78 +613,6 @@ label android_disconnect:
jump android
label android_clean:
python hide:
import shutil
import time
interface = MobileInterface("android")
interface.info(_("Cleaning up Android project."))
# Get the android json file, for the update_always key.
try:
filename = os.path.join(project.current.path, ".android.json")
with open(filename, "rb") as f:
android_json = json.load(f)
except Exception:
android_json = {}
# Clean up the files.
def clean(path):
if os.path.exists(path):
shutil.rmtree(path)
if android_json.get("update_always", True):
try:
with open(rapt.plat.path("project/local.properties"), "r") as f:
local_properties = f.read()
except Exception:
local_properties = None
try:
with open(rapt.plat.path("project/bundle.properties"), "r") as f:
bundle_properties = f.read()
except Exception:
bundle_properties = None
try:
with open(rapt.plat.path("project/gradle.properties"), "r") as f:
gradle_properties = f.read()
except Exception:
gradle_properties = None
clean(rapt.plat.path("project"))
if local_properties or bundle_properties or gradle_properties:
os.mkdir(rapt.plat.path("project"))
if local_properties:
with open(rapt.plat.path("project/local.properties"), "w") as f:
f.write(local_properties)
if bundle_properties:
with open(rapt.plat.path("project/bundle.properties"), "w") as f:
f.write(bundle_properties)
if gradle_properties:
with open(rapt.plat.path("project/gradle.properties"), "w") as f:
f.write(gradle_properties)
clean(rapt.plat.path("bin"))
clean(project.current.temp_filename("android.dist"))
# This can go really fast, so pause so it looks like something is happening.
time.sleep(.5)
jump android
init python:
@@ -714,7 +623,6 @@ init python:
ap.add_argument("--install", action="store_true", help="Installs the app on a device.")
ap.add_argument("--launch", action="store_true", help="Launches the app after build and install complete. Implies --install.")
ap.add_argument("--destination", "--dest", default=None, action="store", help="The directory where the packaged files should be placed.")
ap.add_argument("--package", action="append", help="If given, a package to build. Defaults to building the 'android' package.")
args = ap.parse_args()
@@ -723,12 +631,7 @@ init python:
p = project.Project(args.android_project)
if args.package:
packages = args.package
else:
packages = None
android_build(p=p, gui=False, bundle=args.bundle, install=args.install, launch=args.launch, destination=args.destination, packages=packages)
android_build(p=p, gui=False, bundle=args.bundle, install=args.install, launch=args.launch, destination=args.destination)
return False
+12 -15
View File
@@ -1,4 +1,4 @@
# This file contains strings used by RAPT, so the Ren'Py translation framework
# can find them. It's automatically generated by rapt/update_translations.py, and
# hence should not be changed by hand.
@@ -27,24 +27,21 @@ init python hide:
__("The package name may not contain two dots in a row, or begin or end with a dot.")
__("Each part of the package name must start with a letter, and contain only letters, numbers, and underscores.")
__("{} is a Java keyword, and can't be used as part of a package name.")
__("How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number.")
__("The RAM size must contain only numbers and be positive.")
__("What is the application's version?\n\nThis should be the human-readable version that you would present to a person. It must contain only numbers and dots.")
__("The version number must contain only numbers and dots.")
__("How much RAM do you want to allocate to Gradle?\n\nThis must be a positive integer number.")
__("The RAM size must contain only numbers.")
__("How would you like your application to be displayed?")
__("In landscape orientation.")
__("In portrait orientation.")
__("In the user's preferred orientation.")
__("Which app store would you like to support in-app purchasing through?")
__("Google Play.")
__("Amazon App Store.")
__("Both, in one app.")
__("Neither.")
__("Do you want to automatically update the Java source code?")
__("Yes. This is the best choice for most projects.")
__("No. This may require manual updates when Ren'Py or the project configuration changes.")
__("Unknown configuration variable: {}")
__("I'm compiling a short test program, to see if you have a working JDK on your system.")
__("I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\n{a=https://adoptium.net}https://adoptium.net/{/a}\n\nThe JDK is different from the JRE, so it's possible you have Java without having the JDK. Please install JDK [JDK_REQUIREMENT], and add it to your PATH.\n\nWithout a working JDK, I can't continue.")
__("The version of Java on your computer does not appear to be JDK [JDK_REQUIREMENT], which is required to build Android apps. If you need to install a newer JDK, you can download it from:\n\n{a=https://adoptium.net/}https://adoptium.net/{/a}, and add it to your PATH.\n\nYou can also set the JAVA_HOME environment variable to use a different version of Java.")
__("I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\nhttps://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot\n\nThe JDK is different from the JRE, so it's possible you have Java without having the JDK. Without a working JDK, I can't continue.")
__("The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nYou can also set the JAVA_HOME environment variable to use a different version of Java.")
__("The JDK is present and working. Good!")
__("The Android SDK has already been unpacked.")
__("Do you accept the Android SDK Terms and Conditions?")
@@ -56,12 +53,12 @@ init python hide:
__("I was unable to accept the Android licenses.")
__("I was unable to install the required Android packages.")
__("I've finished installing the required Android packages.")
__("It looks like you're ready to start packaging games.")
__("Please enter your name or the name of your organization.")
__("I found an android.keystore file in the rapt directory. Do you want to use this file?")
__("I can create an application signing key for you. This key is required to create Universal APK for sideloading and stores other than Google Play.\n\nDo you want to create a key?")
__("I will create the key in the android.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of android.keystore, and keep it in a safe place?")
__("\n\nSaying 'No' will prevent key creation.")
__("Could not create android.keystore. Is keytool in your path?")
__("I've finished creating android.keystore. Please back it up, and keep it in a safe place.")
__("I found a bundle.keystore file in the rapt directory. Do you want to use this file?")
__("I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place.")
__("I can create a bundle signing key for you. This key is required to build an Android App Bundle (AAB) for upload to Google Play.\n\nDo you want to create a key?")
__("I will create the key in the bundle.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of bundle.keystore, and keep it in a safe place?")
__("Could not create bundle.keystore. Is keytool in your path?")
__("It looks like you're ready to start packaging games.")
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+20 -30
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -23,17 +23,16 @@
# Contains a reasonable description of the format.
from __future__ import print_function
from renpy.compat import bchr, chr, str, PY2
import struct
import sys
import array
import pefile
import pefile # @UnresolvedImport
# This class performs various operations on memory-loaded binary files,
# including modifications.
class BinFile(object):
def set_u32(self, addr, value):
@@ -68,7 +67,7 @@ class BinFile(object):
rv = u""
for _i in range(c):
rv += chr(self.u16())
rv += unichr(self.u16())
return rv
@@ -76,24 +75,14 @@ class BinFile(object):
self.addr = addr
def tostring(self):
if PY2:
return self.a.tostring() # type: ignore
else:
return self.a.tobytes()
return self.a.tostring()
def substring(self, start, len): # @ReservedAssignment
if PY2:
return self.a[start:start + len].tostring() # type: ignore
else:
return self.a[start:start + len].tobytes()
return self.a[start:start + len].tostring()
def __init__(self, data):
self.a = array.array('B')
if PY2:
self.a.fromstring(data) # type: ignore
else:
self.a.frombytes(data)
self.a = array.array(b'B')
self.a.fromstring(data)
##############################################################################
# These functions parse data out of the file. In these functions, offset is
@@ -117,7 +106,7 @@ def parse_data(bf, offset):
bf.seek(data_offset - resource_virtual)
for _i in range(data_len):
l.append(bchr(bf.u8()))
l.append(chr(bf.u8()))
return (code_page, b"".join(l))
@@ -221,8 +210,8 @@ class Packer(object):
return rv
def pack_dict(self, d, offset):
name_entries = sorted((a, b) for a, b in d.items() if isinstance(a, str))
id_entries = sorted((a, b) for a, b in d.items() if isinstance(a, int))
name_entries = sorted((a, b) for a, b in d.iteritems() if isinstance(a, unicode))
id_entries = sorted((a, b) for a, b in d.iteritems() if isinstance(a, int))
rv = struct.pack("<IIHHHH", 0, 0, 4, 0, len(name_entries), len(id_entries))
@@ -231,7 +220,7 @@ class Packer(object):
rest = b""
for (name, value) in name_entries + id_entries:
if isinstance(name, str):
if isinstance(name, unicode):
name = 0x80000000 | self.pack_name(name)
if isinstance(value, dict):
@@ -329,8 +318,8 @@ def change_icons(oldexe, icofn):
# As a related note, apparently this flag has been deprecated, but appears to be set (I think ..) in the renpy.exe that is used to build from..
# no idea of a consequence, just an observation
# https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics , see "IMAGE_FILE_LINE_NUMS_STRIPPED" :
# COFF line numbers have been removed. This flag is deprecated and should be zero.
# In renpy.exe, this 2-byte flag is @ 0x096 and 0x097 in little-endian
# COFF line numbers have been removed. This flag is deprecated and should be zero.
# In renpy.exe, this 2-byte flag is @ 0x096 and 0x097 in little-endian
######
f.close()
@@ -349,10 +338,10 @@ def change_icons(oldexe, icofn):
#From note about flags above regarding image flags. These two should be 0
pe.FILE_HEADER.Characteristics = pe.FILE_HEADER.Characteristics & (~pefile.IMAGE_CHARACTERISTICS["IMAGE_FILE_LINE_NUMS_STRIPPED"])
pe.FILE_HEADER.Characteristics = pe.FILE_HEADER.Characteristics & (~pefile.IMAGE_CHARACTERISTICS["IMAGE_FILE_LOCAL_SYMS_STRIPPED"])
#Per docs, symbol table can just be removed
#https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#coff-file-header-object-and-image see "PointerToSymbolTable" and "NumberOfSymbols "
pe.FILE_HEADER.PointerToSymbolTable = 0
pe.FILE_HEADER.NumberOfSymbols = 0
@@ -372,7 +361,7 @@ def change_icons(oldexe, icofn):
#
#####
# SizeOfImage must be aligned to SectionAlignment (memory alignment)
# There is NO padding needed, the image size number simply needs to be aligned to >= the
# There is NO padding needed, the image size number simply needs to be aligned to >= the
memoryalignment = pe.OPTIONAL_HEADER.SectionAlignment
filealignment = pe.OPTIONAL_HEADER.FileAlignment
@@ -415,10 +404,11 @@ def change_icons(oldexe, icofn):
#The symbol table is simply left off. Its size DOES factor into ImageSize, but we didn't calculate it above, so fine
#Correctly checksum the file. The entire file is involved in the calculation, so a new PE object must be generated for the calculation to work against
newFile = pe.write()[:base] + rsrc
newpe = pefile.PE(data=bytes(newFile))
newpe = pefile.PE(data=newFile)
newpe.OPTIONAL_HEADER.CheckSum = newpe.generate_checksum()
return bytes(newpe.write())
return newpe.write()
if __name__ == "__main__":
+107 -26
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -19,12 +19,24 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
init python:
try:
import _renpytfd
except Exception:
_renpytfd = None
if renpy.windows:
import EasyDialogsWin as EasyDialogs
else:
EasyDialogs = None
pyobjus = None
if renpy.macintosh:
try:
import pyobjus
except:
pass
def directory_is_writable(path):
test = os.path.join(path, "renpy test do not use")
@@ -38,10 +50,10 @@ init python:
return True
except Exception:
except:
return False
def choose_directory(default_path):
def choose_directory(path):
"""
Pops up a directory chooser.
@@ -54,31 +66,100 @@ init python:
rather than user choice.
"""
if _renpytfd:
path = _renpytfd.selectFolderDialog(__("Select Projects Directory"), default_path)
else:
if path:
default_path = path
path = None
else:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except:
default_path = os.path.abspath(config.renpy_base)
if default_path is None:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except Exception:
default_path = os.path.abspath(config.renpy_base)
if EasyDialogs:
choice = EasyDialogs.AskFolder(defaultLocation=default_path, wanted=unicode)
if choice is not None:
path = choice
else:
path = None
elif pyobjus:
from pyobjus import autoclass
from pyobjus.dylib_manager import load_framework, INCLUDE
load_framework(INCLUDE.AppKit)
NSURL = autoclass('NSURL')
NSOpenPanel = autoclass('NSOpenPanel')
panel = NSOpenPanel.openPanel()
panel.setCanChooseDirectories_(True)
panel.setCanChooseFiles_(False)
panel.setCanCreateDirectories_(True)
if default_path:
url = NSURL.fileURLWithPath_(default_path)
panel.setDirectoryURL_(url)
if panel.runModal():
path = panel.filename().UTF8String().decode("utf-8")
else:
path = None
else:
try:
if renpy.macintosh:
# tkinter is broken on Python 3, so use it as a last resort - maybe apple fixed it?
system_pythons = [ "/usr/bin/python2", "/usr/bin/python", "/usr/bin/python3" ]
else:
system_pythons = [ "/usr/bin/python3", "/usr/bin/python2", "/usr/bin/python" ]
for system_python in system_pythons:
if os.path.exists(system_python):
break
else:
system_python = system_pythons[0]
cmd = [ system_python, os.path.join(config.gamedir, "tkaskdir.py"), renpy.fsencode(default_path) ]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
choice = p.stdout.read()
code = p.wait()
except:
import traceback
traceback.print_exc()
code = 0
choice = ""
path = None
interface.error(_("Ren'Py was unable to run python with tkinter to choose the directory. Please install the python3-tk or tkinter package."), label=None)
if code:
interface.error(_("Ren'Py was unable to run python with tkinter to choose the directory. Please install the python3-tk or tkinter package."), label=None)
elif choice:
path = choice.decode("utf-8")
is_default = False
# Path being None or "" means nothing was selected.
if not path:
path = default_path
is_default = True
if default_path is None or not os.path.isdir(default_path) or not directory_is_writable(default_path):
interface.error(_("No directory was selected, but one is required."))
return default_path, True
# Apply more thorough checks to an explicit path.
path = renpy.fsdecode(path)
if not os.path.isdir(path):
interface.error(_("The selected directory does not exist."))
elif not directory_is_writable(path):
interface.error(_("The selected directory is not writable."))
if (not os.path.isdir(path)) or (not directory_is_writable(path)):
interface.error(_("The selected projects directory is not writable."))
path = default_path
is_default = True
return path, False
if is_default and (not directory_is_writable(path)):
path = os.path.expanduser("~")
return path, is_default
+4 -4
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -294,7 +294,7 @@ init python:
if changed:
try:
os.unlink(filename + ".bak")
except Exception:
except:
pass
os.rename(filename, filename + ".bak")
@@ -323,7 +323,7 @@ init python:
if changed:
try:
os.unlink(filename + ".bak")
except Exception:
except:
pass
os.rename(filename, filename + ".bak")
@@ -333,7 +333,7 @@ init python:
try:
# just in case
os.unlink(filename + ".new")
except Exception:
except:
pass
pass
+9 -9
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -33,15 +33,15 @@ init python:
if renpy.macintosh:
fn = "console.command"
nl = b"\n"
nl = "\n"
prefix = "#!/bin/sh"
elif renpy.windows:
fn = "console.bat"
nl = b"\r\n"
nl = "\r\n"
prefix = "@echo off"
else:
fn = "console.sh"
nl = b"\n"
nl = "\n"
prefix = "#!/bin/bash"
@@ -49,23 +49,23 @@ init python:
self.f = open(self.fn, "wb")
self.nl = nl
self.f.write(renpy.fsencode(prefix, force=True) + nl)
self.f.write(renpy.fsencode(prefix) + nl)
def add(self, *args):
"""
Adds a command to be run.
"""
args = [ b'"' + renpy.fsencode(i, force=True) + b'"' for i in args]
self.f.write(b" ".join(args) + self.nl)
args = [ '"{}"'.format(renpy.fsencode(i)) for i in args]
self.f.write(" ".join(args) + self.nl)
def write(self, *args):
"""
Adds a command to be run.
"""
args = [ renpy.fsencode(i, force=True) for i in args]
self.f.write(b" ".join(args) + self.nl)
args = [ '{}'.format(renpy.fsencode(i)) for i in args]
self.f.write(" ".join(args) + self.nl)
def run(self):
"""
+144 -419
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -26,6 +26,7 @@
# might include windows path separators (\), but archive paths and names we
# deal with/match against use the unix separator (/).
init python in distribute:
from store import config, persistent
@@ -51,58 +52,6 @@ init python in distribute:
import time
import shutil
def py(s):
"""
Formats a string with information about the python version.
"""
return s.format(
major=sys.version_info.major,
minor=sys.version_info.minor,
)
# * Going from 7.4 to 7.5 or 8.0, the library directory changed.
# * 7.7 called os.makedirs with exist_ok=True, even on Python 2.
# * 8.2 wouldn't save the DLC state.
RENPY_PATCH = py("""\
def change_renpy_executable():
import sys, os, renpy, site
if hasattr(site, "RENPY_PLATFORM") and hasattr(sys, "renpy_executable") and (renpy.linux or renpy.windows):
sys.renpy_executable = os.path.join(renpy.config.renpy_base, "lib", "py{major}-" + site.RENPY_PLATFORM, os.path.basename(sys.renpy_executable))
change_renpy_executable()
if sys.version_info.major == 2:
os.old_makedirs = getattr(os, "old_makedirs", os.makedirs)
def makedirs(name, mode=0o777, exist_ok=False):
if exist_ok and os.path.exists(name):
return
os.old_makedirs(name, mode)
os.makedirs = makedirs
def fix_dlc(name, fn):
import sys, os
if not os.path.exists(os.path.join(config.renpy_base, fn)):
return
u = sys._getframe(2).f_locals["self"]
if name in u.current_state:
return
u.add_dlc_state(name)
fix_dlc("steam", "lib/py3-linux-x86_64/libsteam_api.so")
fix_dlc("steam", "lib/py2-linux-x86_64/libsteam_api.so")
fix_dlc("web", "web")
fix_dlc("rapt", "rapt")
fix_dlc("renios", "renios")
""")
match_cache = { }
def compile_match(pattern):
@@ -227,7 +176,7 @@ fix_dlc("renios", "renios")
key = (self.name, self.directory, self.executable)
hash.update(repr(key).encode("utf-8"))
hash.update(repr(key))
if self.path is None:
return
@@ -242,16 +191,9 @@ fix_dlc("renios", "renios")
digest = distributor.hash_cache[self.path]
else:
digest = hash_file(self.path)
distributor.hash_cache[self.path] = digest
hash.update(digest.encode("utf-8"))
def reprefix(self, old, new):
rv = self.copy()
if self.name.startswith(old):
rv.name = new + self.name[len(old):]
return rv
hash.update(digest)
class FileList(list):
"""
@@ -293,34 +235,6 @@ fix_dlc("renios", "renios")
return rv
def add_missing_directories(self):
"""
Adds to this file list all directories that are needed by other
entries in this file list.
"""
rv = self.copy()
seen = set()
required = set()
for i in self:
seen.add(i.name)
name = i.name
while "/" in name:
name = name.rpartition("/")[0]
required.add(name)
for name in required - seen:
rv.append(File(name, None, True, False))
rv.sort()
return rv
@staticmethod
def merge(l):
"""
@@ -399,15 +313,13 @@ fix_dlc("renios", "renios")
duplicate is set.
"""
prefix = py("lib/py{major}-mac-universal")
for f in list(self):
if f.name.startswith("lib/python") and (not duplicate):
if f.name.startswith("lib/python2.7") and (not duplicate):
name = app + "/Contents/Resources/" + f.name
elif f.name.startswith(prefix):
name = app + "/Contents/MacOS/" + f.name[len(prefix)+1:]
elif f.name.startswith("lib/mac-x86_64"):
name = app + "/Contents/MacOS/" + f.name[15:]
else:
continue
@@ -432,10 +344,7 @@ fix_dlc("renios", "renios")
for f in sorted(self, key=lambda a : a.name):
f.hash(sha, distributor)
if PY2:
return sha.hexdigest().decode("utf-8")
else:
return sha.hexdigest()
return sha.hexdigest()
def split_by_prefix(self, prefix):
"""
@@ -454,25 +363,13 @@ fix_dlc("renios", "renios")
return yes, no
def reprefix(self, old, new):
"""
Returns a new file list with all the paths reprefixed.
"""
rv = FileList()
for f in self:
rv.append(f.reprefix(old, new))
return rv
class Distributor(object):
"""
This manages the process of building distributions.
"""
def __init__(self, project, destination=None, reporter=None, packages=None, build_update=True, open_directory=False, noarchive=False, packagedest=None, report_success=True, scan=True, macapp=None, force_format=None, files_filter=None):
def __init__(self, project, destination=None, reporter=None, packages=None, build_update=True, open_directory=False, noarchive=False, packagedest=None, report_success=True, scan=True, macapp=None):
"""
Distributes `project`.
@@ -506,20 +403,16 @@ fix_dlc("renios", "renios")
`macapp`
If given, the path to a macapp that's used instead of
the macapp that's included with Ren'Py.
`force_format`
If given, forces the format of the distribution to be this.
`files_filter`
If given, use this object to decide which files must be included.
The object must contains the `filter(file, variant, format)`
method which must return True is the file must be included.
the macapp
"""
# A map from a package to a unique update version hash.
self.update_versions = { }
# Map from destination file with extension to (that file's hash,
# hash of the file list)
self.build_cache = { }
# A map from file to its hash.
self.hash_cache = { }
@@ -551,18 +444,10 @@ fix_dlc("renios", "renios")
# dictionaries.
data = project.data
# Reset the RPU update builder.
RPUPackage.reset()
if scan:
self.reporter.info(_("Scanning project files..."))
project.update_dump(force=True, gui=False, compile=project.data['force_recompile'])
if project.data['tutorial']:
self.reporter.info(_("Building distributions failed:\n\nThe project is the Ren'Py Tutorial, which can't be distributed outside of Ren'Py. Consider using The Question as a test project."), pause=True)
self.log.close()
return
if project.data['force_recompile']:
import compileall
@@ -586,10 +471,7 @@ fix_dlc("renios", "renios")
self.pretty_version = build['version']
if (" " in self.base_name) or (":" in self.base_name) or (";" in self.base_name):
reporter.info(
_("Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."),
submessage=_("This may be derived from build.name and config.version or build.version."),
pause=True)
reporter.info(_("Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."), pause=True)
self.log.close()
return
@@ -604,17 +486,16 @@ fix_dlc("renios", "renios")
if not packagedest:
try:
os.makedirs(self.destination)
except Exception:
except:
pass
self.load_build_cache()
self.packagedest = packagedest
self.include_update = build['include_update']
self.build_update = self.include_update and build_update
if self.include_update:
self.make_key_pem()
# The various executables, which change names based on self.executable_name.
self.app = self.executable_name + ".app"
self.exe = self.executable_name + ".exe"
@@ -651,10 +532,6 @@ fix_dlc("renios", "renios")
self.reporter.info(_("Scanning Ren'Py files..."))
self.scan_and_classify(config.renpy_base, build["renpy_patterns"])
if build["_sdk_fonts"]:
for k in list(self.file_lists.keys()):
self.file_lists[k] = self.file_lists[k].reprefix("sdk-fonts", "game")
# Add Python (with the same name as our executables)
self.add_python()
@@ -679,31 +556,15 @@ fix_dlc("renios", "renios")
self.merge_file_lists()
# Rename the executable-like files.
self.rename()
# Sign the mac app once on Ren'Py.
if self.build["renpy"]:
fl = self.file_lists['binary']
app, rest = fl.split_by_prefix(self.app)
if app:
app = self.sign_app(app, macapp)
fl = FileList.merge([ app, rest ])
self.file_lists['binary'] = fl
else:
raise Exception("No mac app found.")
if not build['renpy']:
self.rename()
# The time of the update version.
self.update_version = int(time.time())
self.files_filter = files_filter
for p in build_packages:
formats = p["formats"]
if force_format is not None:
formats = [ force_format ]
for f in formats:
for f in p["formats"]:
self.make_package(
p["name"],
@@ -712,18 +573,20 @@ fix_dlc("renios", "renios")
dlc=p["dlc"])
if self.build_update and p["update"]:
for update_format in self.list_update_formats():
self.make_package(
p["name"],
update_format,
p["file_lists"],
dlc=p["dlc"])
self.make_package(
p["name"],
"update",
p["file_lists"],
dlc=p["dlc"])
wait_parallel_threads()
if self.build_update:
self.finish_updates(build_packages)
if not packagedest:
self.save_build_cache()
# Finish up.
self.log.close()
@@ -731,24 +594,7 @@ fix_dlc("renios", "renios")
self.reporter.info(_("All packages have been built.\n\nDue to the presence of permission information, unpacking and repacking the Linux and Macintosh distributions on Windows is not supported."))
if open_directory:
renpy.run(store.OpenDirectory(self.destination, absolute=True))
def list_update_formats(self):
"""
Returns a list of update formats to build.
"""
rv = [ ]
for update_format in self.build["update_formats"]:
if update_format == "rpu":
rv.append("rpu")
elif update_format == "zsync":
rv.append("update")
else:
raise Exception("Unknown update format: " + update_format)
return rv
store.OpenDirectory(self.destination)()
def scan_and_classify(self, directory, patterns):
"""
@@ -774,37 +620,29 @@ fix_dlc("renios", "renios")
is_dir = os.path.isdir(path)
if is_dir:
match_names = [ name + "/", name ]
match_name = name + "/"
else:
match_names = [ name ]
match_name = name
for pattern, file_list in patterns:
matched = False
if match(match_name, pattern):
for match_name in match_names:
# When we have ('test/**', None), avoid excluding test.
if (not file_list) and is_dir:
new_pattern = pattern.rstrip("*")
if (pattern != new_pattern) and match(match_name, new_pattern):
continue
if match(match_name, pattern):
# When we have ('test/**', None), avoid excluding test.
if (not file_list) and is_dir:
new_pattern = pattern.rstrip("*")
if (pattern != new_pattern) and match(match_name, new_pattern):
continue
matched = True
break
if matched:
break
else:
print(str(match_names[0]), "doesn't match anything.", file=self.log)
print(str(match_name), "doesn't match anything.", file=self.log)
pattern = None
file_list = None
print(str(match_names[0]), "matches", str(pattern), "(" + str(file_list) + ").", file=self.log)
print(str(match_name), "matches", str(pattern), "(" + str(file_list) + ").", file=self.log)
if file_list is None:
return
@@ -989,16 +827,6 @@ fix_dlc("renios", "renios")
self.add_file("all", "game/script_version.txt", script_version_txt)
if self.build["info"]:
build_info_json = self.temp_filename("build_info.json")
with open(build_info_json, "w") as f:
json.dump(self.build["info"], f)
self.add_file("all", "game/cache/build_info.json", build_info_json)
def add_file_list_hash(self, list_name):
"""
Hashes a file list, then adds that file to the Ren'Py distribution.
@@ -1006,7 +834,7 @@ fix_dlc("renios", "renios")
tfn = self.temp_filename(list_name + "_hash.txt")
with open(tfn, "w") as tf:
with open(tfn, "wb") as tf:
tf.write(self.file_lists[list_name].hash(self))
self.add_file("binary", "launcher/game/" + list_name + "_hash.txt", tfn)
@@ -1027,7 +855,7 @@ fix_dlc("renios", "renios")
data = f.read()
with open(tmp_fn, "wb") as f:
f.write(b"#!/usr/bin/env python3\n")
f.write(b"#!/usr/bin/env python2\n")
f.write(data)
self.add_file("source_only", "renpy.py", tmp_fn, True)
@@ -1044,7 +872,6 @@ fix_dlc("renios", "renios")
CFBundleDisplayName=display_name,
CFBundleExecutable=executable_name,
CFBundleIconFile="icon",
CFBundleIdentifier="com.domain.game",
CFBundleInfoDictionaryVersion="6.0",
CFBundleName=display_name,
CFBundlePackageType="APPL",
@@ -1074,13 +901,7 @@ fix_dlc("renios", "renios")
plist.update(self.build.get("mac_info_plist", { }))
rv = self.temp_filename("Info.plist")
if PY2:
plistlib.writePlist(plist, rv)
else:
with open(rv, "wb") as f:
plistlib.dump(plist, f)
plistlib.writePlist(plist, rv)
return rv
def add_python(self):
@@ -1090,58 +911,44 @@ fix_dlc("renios", "renios")
linux = 'binary'
linux_i686 = 'binary'
mac = 'binary'
raspi = 'linux_arm'
raspi = 'raspi'
else:
windows = 'windows'
linux = 'linux'
linux_i686 = 'linux_i686'
mac = 'mac'
raspi = 'linux_arm'
raspi = 'linux'
prefix = py("lib/py{major}-")
i686fn = os.path.join(config.renpy_base, prefix + "linux-i686/renpy")
if os.path.exists(i686fn):
self.add_file(
linux_i686,
prefix + "linux-i686/" + self.executable_name,
i686fn,
True)
self.add_file(
linux_i686,
"lib/linux-i686/" + self.executable_name,
os.path.join(config.renpy_base, "lib/linux-i686/renpy"),
True)
self.add_file(
linux,
prefix + "linux-x86_64/" + self.executable_name,
os.path.join(config.renpy_base, prefix + "linux-x86_64/renpy"),
"lib/linux-x86_64/" + self.executable_name,
os.path.join(config.renpy_base, "lib/linux-x86_64/renpy"),
True)
armfn = os.path.join(config.renpy_base, prefix + "linux-armv7l/renpy")
armfn = os.path.join(config.renpy_base, "lib/linux-armv7l/renpy")
if os.path.exists(armfn):
self.add_file(
raspi,
prefix + "linux-armv7l/" + self.executable_name,
"lib/linux-armv7l/" + self.executable_name,
armfn,
True)
aarch64fn = os.path.join(config.renpy_base, prefix + "linux-aarch64/renpy")
if os.path.exists(aarch64fn):
self.add_file(
raspi,
prefix + "linux-aarch64/" + self.executable_name,
aarch64fn,
True)
self.add_file(
mac,
prefix + "mac-universal/" + self.executable_name,
os.path.join(config.renpy_base, prefix + "mac-universal/renpy"),
"lib/mac-x86_64/" + self.executable_name,
os.path.join(config.renpy_base, "lib/mac-x86_64/renpy"),
True)
def add_mac_files(self):
"""
Add mac-specific files to the distro.
@@ -1160,11 +967,9 @@ fix_dlc("renios", "renios")
plist_fn = self.write_plist()
self.add_file(filelist, contents + "/Info.plist", plist_fn)
self.add_file(filelist,
contents + "/MacOS/" + self.executable_name,
os.path.join(config.renpy_base, py("lib/py{major}-mac-universal/renpy")))
os.path.join(config.renpy_base, "lib/mac-x86_64/renpy"))
custom_fn = os.path.join(self.project.path, "icon.icns")
default_fn = os.path.join(config.renpy_base, "launcher/icon.icns")
@@ -1181,8 +986,8 @@ fix_dlc("renios", "renios")
if not self.build['renpy']:
self.add_directory(filelist, contents + "/MacOS/lib")
self.add_directory(filelist, contents + py("/MacOS/lib/py{major}-mac-universal"))
self.add_directory(filelist, contents + py("/Resources/lib/python{major}.{minor}"))
self.add_directory(filelist, contents + "/MacOS/lib/mac-x86_64")
self.add_directory(filelist, contents + "/Resources/lib/python2.7")
self.file_lists[filelist].mac_lib_transform(self.app, self.build['renpy'])
@@ -1228,20 +1033,12 @@ fix_dlc("renios", "renios")
if os.path.exists(tmp):
self.add_file(fl, dst, tmp)
if PY2:
if self.build["include_i686"]:
write_exe("lib/py2-windows-i686/renpy.exe", self.exe32, self.exe32, windows_i686)
write_exe("lib/py2-windows-i686/pythonw.exe", "lib/py2-windows-i686/pythonw.exe", "pythonw-32.exe", windows_i686)
write_exe("lib/py2-windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/py2-windows-x86_64/pythonw.exe", "lib/py2-windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
else:
write_exe("lib/py3-windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/py3-windows-x86_64/pythonw.exe", "lib/py3-windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
if self.build["include_i686"]:
write_exe("lib/windows-i686/renpy.exe", self.exe32, self.exe32, windows_i686)
write_exe("lib/windows-i686/pythonw.exe", "lib/windows-i686/pythonw.exe", "pythonw-32.exe", windows_i686)
write_exe("lib/windows-x86_64/renpy.exe", self.exe, self.exe, windows)
write_exe("lib/windows-x86_64/pythonw.exe", "lib/windows-x86_64/pythonw.exe", "pythonw-64.exe", windows)
def add_main_py(self):
if self.build['renpy']:
@@ -1268,15 +1065,11 @@ fix_dlc("renios", "renios")
Rename files in all lists to match the executable names.
"""
major_sh = py("renpy{major}.sh")
def rename_one(fn):
parts = fn.split('/')
p = parts[0]
if p == major_sh:
p = self.sh
elif p == "renpy.sh":
if p == "renpy.sh":
p = self.sh
elif p == "renpy.py":
p = self.py
@@ -1302,7 +1095,7 @@ fix_dlc("renios", "renios")
try:
import sys, os
isatty = os.isatty(sys.stdin.fileno())
except Exception:
except:
isatty = False
if isatty:
@@ -1395,13 +1188,13 @@ fix_dlc("renios", "renios")
def workaround_mac_notarization(self, fl):
"""
This works around mac notarization by compressing the unsigned,
un-notarized, binaries in lib/py3-mac-universal.
un-notarized, binaries in lib/mac-x86_64.
"""
fl = fl.copy()
for f in fl:
if py("/lib/py{major}-mac-universal/") in f.name:
if "/lib/mac-x86_64/" in f.name:
with open(f.path, "rb") as inf:
data = inf.read()
@@ -1435,19 +1228,15 @@ fix_dlc("renios", "renios")
if self.build.get("exclude_empty_directories", True):
fl = fl.filter_empty()
fl = fl.add_missing_directories()
if macapp:
fl = fl.mac_transform(self.app, self.documentation_patterns)
if not self.build["renpy"]:
app, rest = fl.split_by_prefix(self.app)
app, rest = fl.split_by_prefix(self.app)
if app:
app = self.sign_app(app, macapp)
if app:
app = self.sign_app(app, macapp)
fl = FileList.merge([ app, rest ])
fl = FileList.merge([ app, rest ])
self.file_list_cache[key] = fl
return fl.copy()
@@ -1483,7 +1272,6 @@ fix_dlc("renios", "renios")
FORMATS = {
"update" : (".update", False, False, False),
"rpu" : ("", False, False, False),
"tar.bz2" : (".tar.bz2", False, False, True),
"zip" : (".zip", False, False, True),
@@ -1493,11 +1281,6 @@ fix_dlc("renios", "renios")
"app-zip" : (".zip", False, False, False),
"app-directory" : ("-app", True, False, False),
"app-dmg" : ("-app-dmg", True, True, False),
"bare-tar.bz2" : (".tar.bz2", False, False, False),
"bare-zip" : (".zip", False, False, False),
"null" : ( "", True, False, False),
}
if format not in FORMATS:
@@ -1533,21 +1316,17 @@ fix_dlc("renios", "renios")
update = { variant : { "version" : self.update_versions[variant], "base_name" : self.base_name, "files" : update_files, "directories" : update_directories, "xbit" : update_xbit } }
update_fn = self.temp_filename(filename + ".update.json")
update_fn = os.path.join(self.destination, filename + ".update.json")
if self.include_update and (variant not in [ 'ios', 'android', 'source']) and (not format.startswith("app-")):
if self.include_update and not format.startswith("app-"):
with open(update_fn, "wb" if PY2 else "w") as f:
with open(update_fn, "wb") as f:
json.dump(update, f, indent=2)
if (not dlc) or (format == "update"):
fl.append(File("update", None, True, False))
fl.append(File("update/current.json", update_fn, False, False))
if not dlc:
fl.append(File("update/key.pem", self.temp_filename("key.pem"), False, False))
# If we're not an update file, prepend the directory.
if (not dlc) and prepend:
fl.prepend_directory(filename)
@@ -1558,9 +1337,19 @@ fix_dlc("renios", "renios")
full_filename = filename + ext
path += ext
if format == "rpu":
full_filename = "rpu/" + variant + ".files.rpu"
path = self.destination + "/" + full_filename
if self.build['renpy']:
fl_hash = fl.hash(self)
else:
fl_hash = '<not building renpy>'
file_hash, old_fl_hash = self.build_cache.get(full_filename, ("", ""))
if (not directory) and (old_fl_hash == fl_hash) and not(self.build['renpy'] and (variant == "sdk")):
if file_hash:
self.build_cache[full_filename] = (file_hash, fl_hash)
return
def done():
"""
@@ -1568,26 +1357,23 @@ fix_dlc("renios", "renios")
in this thread or a background thread.
"""
final_update_fn = os.path.join(self.destination, filename + ".update.json")
if self.build_update or dlc:
if self.include_update and not self.build_update and not dlc:
if os.path.exists(update_fn):
shutil.copy(update_fn, final_update_fn)
os.unlink(update_fn)
if not directory:
file_hash = hash_file(path)
else:
file_hash = ""
if format == "tar.bz2" or format == "bare-tar.bz2":
if file_hash:
self.build_cache[full_filename] = (file_hash, fl_hash)
if format == "tar.bz2":
pkg = TarPackage(path, "w:bz2")
elif format == "update":
pkg = UpdatePackage(path, filename, self.destination)
elif format == "rpu":
pkg = RPUPackage(self.destination, variant)
elif format == "null":
pkg = NullPackage()
elif format == "zip" or format == "app-zip" or format == "bare-zip":
elif format == "zip" or format == "app-zip":
if self.build['renpy']:
pkg = ExternalZipPackage(path)
else:
@@ -1616,20 +1402,17 @@ fix_dlc("renios", "renios")
if f.directory:
pkg.add_directory(f.name, f.path)
else:
if self.files_filter is not None and not self.files_filter.filter(f, variant, format):
# Ignore file
continue
pkg.add_file(f.name, f.path, f.executable)
self.reporter.progress_done()
if format == "update":
# Build the zsync file.
self.reporter.info(_("Making the [variant] update zsync file."), variant=variant)
def close_progress(done, total):
self.reporter.progress(_("Finishing the [variant] [format] package."), done, total, variant=variant, format=format)
pkg.close(close_progress)
pkg.close()
if done is not None:
done()
@@ -1645,77 +1428,72 @@ fix_dlc("renios", "renios")
index = { }
# Ren'Py 7.4.1 forgot to include mac zsync, so it needs to be downloaded before the update
# can occur.
if self.build['renpy']:
index["monkeypatch"] = RENPY_PATCH
index["monkeypatch"] = "def mac_fix():\n import renpy\n if not renpy.macintosh:\n return\n\n import os\n mac = os.path.join(renpy.config.renpy_base, \"lib\", \"mac-x86_64\")\n zsync = os.path.join(mac, \"zsync\")\n\n if not os.path.isdir(mac):\n return\n\n if os.path.isdir(zsync):\n return\n\n import requests\n\n response = requests.get(\"https://www.renpy.org/dl/mac-fix/zsync\")\n\n with open(zsync + \".new\", \"w\") as f:\n f.write(response.content)\n \n os.chmod(zsync + \".new\", 0o755)\n os.rename(zsync + \".new\", zsync)\n\nmac_fix()\n"
def add_variant(variant):
digest = self.build_cache[self.base_name + "-" + variant + ".update"][0]
sums_size = os.path.getsize(self.destination + "/" + self.base_name + "-" + variant + ".sums")
index[variant] = {
"version" : self.update_versions[variant],
"pretty_version" : self.pretty_version,
"renpy_version" : renpy.version_only,
}
"digest" : digest,
"zsync_url" : self.base_name + "-" + variant + ".zsync",
"sums_url" : self.base_name + "-" + variant + ".sums",
"sums_size" : sums_size,
"json_url" : self.base_name + "-" + variant + ".update.json",
}
if "zsync" in self.build["update_formats"]:
fn = renpy.fsencode(os.path.join(self.destination, self.base_name + "-" + variant + ".update"))
digest = hash_file(self.destination + "/" + self.base_name + "-" + variant + ".update")
sums_size = os.path.getsize(self.destination + "/" + self.base_name + "-" + variant + ".sums")
index[variant].update({
"digest" : digest,
"zsync_url" : self.base_name + "-" + variant + ".zsync",
"sums_url" : self.base_name + "-" + variant + ".sums",
"sums_size" : sums_size,
"json_url" : self.base_name + "-" + variant + ".update.json",
})
fn = renpy.fsencode(os.path.join(self.destination, self.base_name + "-" + variant + ".update"))
if os.path.exists(fn):
os.unlink(fn)
if "rpu" in self.build["update_formats"]:
index[variant]["rpu_url"] = "rpu/" + variant + ".files.rpu"
index[variant]["rpu_digest"] = hash_file(self.destination + "/rpu/" + variant + ".files.rpu")
if os.path.exists(fn):
os.unlink(fn)
for p in packages:
if p["update"]:
add_variant(p["name"])
update_data = json.dumps(index, indent=2)
if not isinstance(update_data, bytes):
update_data = update_data.encode("utf-8")
fn = renpy.fsencode(os.path.join(self.destination, "updates.json"))
with open(fn, "wb") as f:
f.write(update_data)
json.dump(index, f, indent=2)
# Write the signed file.
import ecdsa
with open(self.find_update_pem(), "rb") as f:
signing_key = ecdsa.SigningKey.from_pem(f.read())
def save_build_cache(self):
if not self.build['renpy']:
return
fn = renpy.fsencode(os.path.join(self.destination, ".build_cache"))
fn = renpy.fsencode(os.path.join(self.destination, "updates.ecdsa"))
with open(fn, "wb") as f:
f.write(signing_key.sign(update_data))
for k, v in self.build_cache.items():
l = "\t".join([k, v[0], v[1]]) + "\n"
f.write(l.encode("utf-8"))
def find_update_pem(self):
if self.build['renpy']:
return os.path.join(config.renpy_base, "update.pem")
else:
return os.path.join(self.project.path, "update.pem")
def load_build_cache(self):
if not self.build['renpy']:
return
def make_key_pem(self):
import ecdsa
fn = renpy.fsencode(os.path.join(self.destination, ".build_cache"))
with open(self.find_update_pem(), "rb") as f:
signing_key = ecdsa.SigningKey.from_pem(f.read())
if not os.path.exists(fn):
return
key_pem = self.temp_filename("key.pem")
with open(key_pem, "wb") as f:
f.write(signing_key.verifying_key.to_pem())
with open(fn, "rb") as f:
for l in f:
if not l:
continue
l = l.decode("utf-8").rstrip()
l = l.split("\t")
self.build_cache[l[0]] = (l[1], l[2])
os.unlink(fn)
def dump(self):
for k, v in sorted(self.file_lists.items()):
@@ -1786,8 +1564,6 @@ fix_dlc("renios", "renios")
ap.add_argument("--package", action="append", help="If given, a package to build. Defaults to building all packages.")
ap.add_argument("--no-archive", action="store_true", help="If given, files will not be added to archives.")
ap.add_argument("--macapp", default=None, action="store", help="If given, the path to a signed and notarized mac app.")
ap.add_argument("--format", default=None, action="store", help="The format of package to build.")
ap.add_argument("project", help="The path to the project directory.")
args = ap.parse_args()
@@ -1799,58 +1575,12 @@ fix_dlc("renios", "renios")
else:
packages = None
Distributor(p, destination=args.destination, reporter=TextReporter(), packages=packages, build_update=args.build_update, noarchive=args.no_archive, packagedest=args.packagedest, macapp=args.macapp, force_format=args.format)
Distributor(p, destination=args.destination, reporter=TextReporter(), packages=packages, build_update=args.build_update, noarchive=args.no_archive, packagedest=args.packagedest, macapp=args.macapp)
return False
renpy.arguments.register_command("distribute", distribute_command)
def update_old_game(project, reporter, compile):
if compile:
reporter.info(_("Recompiling all rpy files into rpyc files..."))
project.launch([ "compile", "--keep-orphan-rpyc" ], wait=True)
files = [fn + "c" for fn in project.script_files()
if fn.startswith("game/") and project.exists(fn + "c")]
len_files = len(files)
if not files:
return
TEMP_OLD_GAME_DIR = project.temp_filename("old-game")
if os.path.isdir(TEMP_OLD_GAME_DIR):
shutil.rmtree(TEMP_OLD_GAME_DIR)
for i, src in enumerate(files):
reporter.progress(_("Copying files..."), i, len_files)
dst = project.temp_filename("old-" + src)
try:
os.makedirs(os.path.dirname(dst))
except Exception:
pass
shutil.copyfile(os.path.join(project.path, src), dst)
reporter.progress_done()
OLD_GAME_DIR = os.path.join(project.path, "old-game")
if os.path.isdir(OLD_GAME_DIR):
shutil.rmtree(OLD_GAME_DIR)
shutil.copytree(TEMP_OLD_GAME_DIR, OLD_GAME_DIR)
def update_old_game_command():
ap = renpy.arguments.ArgumentParser("Back-ups all rpyc files into old-game directory.")
ap.add_argument("project", help="The path to the project directory.")
args = ap.parse_args()
update_old_game(project.Project(args.project), TextReporter(), True)
return False
renpy.arguments.register_command("update_old_game", update_old_game_command)
label distribute:
python hide:
@@ -1865,8 +1595,3 @@ label distribute:
jump post_build
label update_old_game:
python hide:
distribute.update_old_game(project.current, distribute.GuiReporter(), False)
return
+2 -28
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -192,7 +192,6 @@ screen build_distributions:
textbutton _("Edit options.rpy") action editor.Edit("game/options.rpy", check=True)
textbutton _("Add from clauses to calls, once") action Jump("add_from")
textbutton _("Update old-game") action Jump("start_update_old_game")
textbutton _("Refresh") action Jump("build_distributions")
add HALF_SPACER
@@ -222,13 +221,7 @@ screen build_distributions:
for pkg in packages:
if not pkg["hidden"]:
$ description = pkg["description"]
button:
action PackageToggle(pkg["name"]) style "l_checkbox"
hbox:
spacing 3
text "[description!q]"
if pkg["dlc"]:
text _("(DLC)")
textbutton "[description!q]" action PackageToggle(pkg["name"]) style "l_checkbox"
add SPACER
add HALF_SPACER
@@ -263,27 +256,8 @@ label add_from:
call add_from_common
jump build_distributions
label start_update_old_game:
call update_old_game
jump build_distributions
label add_update_pem:
python hide:
interface.info("You're trying to build an update, but an update.pem file doesn't exist.\n\nThis file is used to sign updates, and will be automatically created in your projects's base directory.\n\nYou'll need to back up update.pem and keep it safe.", cancel=Jump("build_distributions"))
import ecdsa
key = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p).to_pem()
with open(os.path.join(project.current.path, "update.pem"), "wb") as f:
f.write(key)
return
label start_distribute:
if project.current.dump["build"]["include_update"] and not os.path.exists(os.path.join(project.current.path, "update.pem")):
call add_update_pem
if project.current.data["add_from"]:
call add_from_common
+3 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -36,13 +36,13 @@ init python:
if os.path.exists(fn):
os.unlink(fn)
with open(fn, "w") as f:
with open(fn, "wb") as f:
f.write("Testing to see if we're in a DMG.\r\n")
os.unlink(fn)
return
except Exception:
except:
# If we're here, we didn't make it through the checks safely. So
# put up a warning message.
+26 -8
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -21,13 +21,27 @@
init python:
import requests
import urllib.request
import os
import threading
import time
ssl_context_cache = None
def ssl_context():
"""
Returns the SSL context.
"""
global ssl_context_cache
if ssl_context_cache is None:
import ssl
import certifi
ssl_context_cache = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=certifi.where())
return ssl_context_cache
class Downloader(object):
def __init__(self, url, dest):
@@ -59,7 +73,7 @@ init python:
try:
# Open the URL.
self.urlfile = requests.get(url, stream=True, proxies=renpy.proxies, timeout=15)
self.urlfile = urllib.request.urlopen(url, context=ssl_context())
t = threading.Thread(target=self.thread)
t.daemon = True
@@ -78,7 +92,12 @@ init python:
else:
length = 0
for data in self.urlfile.iter_content(1024 * 1024):
while not self.cancelled:
data = self.urlfile.read(65536)
if not data:
break
count += len(data)
self.tmpfile.write(data)
@@ -86,9 +105,6 @@ init python:
if length > 0:
self.progress = 1.0 * count / length
if self.cancelled:
break
self.tmpfile.close()
if self.cancelled:
@@ -106,6 +122,7 @@ init python:
except Exception as e:
self.failure = str(e)
def safe_unlink(self, fn):
if os.path.exists(fn):
os.unlink(fn)
@@ -147,3 +164,4 @@ init python:
def periodic(self, st):
self.adjustment.change(self.downloader.progress)
return .25
+30 -184
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -67,8 +67,8 @@ init 1 python in editor:
ei = EditorInfo(filename)
if ei.name in editors:
if editors[ei.name].mtime >= ei.mtime:
return
if editors[ei.name].mtime >= ei.mtime:
return
editors[ei.name] = ei
@@ -112,7 +112,7 @@ init 1 python in editor:
editor is installed or not.
"""
def __init__(self, priority, name, description=None, dlc=None, dldescription=None, error_message=None, deprecated=False):
def __init__(self, priority, name, description=None, dlc=None, dldescription=None, error_message=None):
# The priority of the editor. Lower priorities will come later
# in the list.
self.priority = priority
@@ -135,29 +135,6 @@ init 1 python in editor:
# An error message to display if the editor failed to start.
self.error_message = error_message
# If the editor is considered deprecated for use with Ren'Py.
self.deprecated = deprecated
def vscode_path():
"""
Gets the path to VS Code for this platform.
"""
if renpy.windows:
return os.path.join(config.renpy_base, "vscode/VSCode-win32-x64")
elif renpy.macintosh:
return os.path.join(config.renpy_base, "vscode/Visual Studio Code.app")
else:
if renpy.arch == "aarch64":
arch = "arm64"
elif renpy.arch == "armv7l":
arch = "arm"
else:
arch = "x64"
return os.path.join(config.renpy_base, "vscode/VSCode-linux-" + arch)
def fancy_scan_editors():
"""
Creates the list of FancyEditorInfo objects.
@@ -171,72 +148,39 @@ init 1 python in editor:
fei = fancy_editors = [ ]
# Visual Studio Code
AD1 = _("A modern editor with many extensions including advanced Ren'Py integration.")
AD2 = _("A modern editor with many extensions including advanced Ren'Py integration.\n{a=jump:reinstall_vscode}Upgrade Visual Studio Code to the latest version.{/a}")
# Atom.
AD = _("(Recommended) A modern and approachable text editor.")
installed = os.path.exists(vscode_path())
if renpy.windows:
dlc = "atom-windows"
installed = os.path.exists(os.path.join(config.basedir, "atom/atom-windows"))
elif renpy.macintosh:
dlc = "atom-mac"
installed = os.path.exists(os.path.join(config.basedir, "atom/Atom.app"))
else:
dlc = "atom-linux"
installed = os.path.exists(os.path.join(config.basedir, "atom/atom-linux-" + platform.machine()))
e = FancyEditorInfo(
0,
_("Visual Studio Code"),
AD2 if installed else AD2,
"extension:vscode",
_("Up to 110 MB download required."),
"Atom",
AD,
dlc,
_("Up to 150 MB download required."),
None)
e.installed = e.installed and installed
fei.append(e)
# Atom.
AD = _("Atom is deprecated and its bugs are known for corrupting games, using another editor is recommended.")
if renpy.windows:
dlc = "atom-windows"
installed = os.path.exists(os.path.join(config.renpy_base, "atom/atom-windows"))
elif renpy.macintosh:
dlc = "atom-mac"
installed = os.path.exists(os.path.join(config.renpy_base, "atom/Atom.app"))
else:
dlc = "atom-linux"
installed = os.path.exists(os.path.join(config.renpy_base, "atom/atom-linux-" + platform.machine()))
if not (renpy.arch in [ "aarch64", "armv7l" ]):
e = FancyEditorInfo(
1,
_("Atom"),
AD,
"extension:atom",
_("Up to 150 MB download required."),
None,
deprecated=True,
)
e.installed = e.installed and (installed or 'RENPY_ATOM' in os.environ)
fei.append(e)
# jEdit - Only present if it exists on system.
e = FancyEditorInfo(
# jEdit
fei.append(FancyEditorInfo(
2,
_("jEdit"),
_("JEdit is deprecated, using another editor is recommended."),
"jEdit",
_("A mature editor that requires Java."),
"jedit",
_("1.8 MB download required."),
_("This may have occured because Java is not installed on this system."),
deprecated=True,
)
e.installed = e.installed and os.path.exists(os.path.join(config.renpy_base, "jedit"))
fei.append(e)
fei.append(FancyEditorInfo(
3,
_("Visual Studio Code (System)"),
_("Uses a copy of Visual Studio Code that you have installed outside of Ren'Py. It's recommended you install the language-renpy extension to add support for Ren'Py files."),
))
fei.append(FancyEditorInfo(
@@ -246,7 +190,7 @@ init 1 python in editor:
None))
for k in editors:
if k in [ "Visual Studio Code", "Visual Studio Code (System)", "Atom", "jEdit", "System Editor", "None" ]:
if k in [ "Atom", "jEdit", "System Editor", "None" ]:
continue
fei.append(FancyEditorInfo(
@@ -266,8 +210,7 @@ init 1 python in editor:
# If we're in a linux distro or something, assume all editors work.
if not updater.can_update():
for i in fei:
if i.dlc and not i.dlc.startswith("extension:") and not i.deprecated:
i.installed = True
i.installed = True
def fancy_activate_editor(default=False):
"""
@@ -314,12 +257,9 @@ init 1 python in editor:
if not fe.installed:
if fe.dlc.startswith("extension:"):
import installer
manifest = fe.dlc.partition(":")[2]
renpy.invoke_in_new_context(installer.manifest, "https://www.renpy.org/extensions/{}/{}.py".format(manifest, manifest), renpy=True)
else:
store.add_dlc(fe.dlc)
# We don't check the status of this because fancy_activate_editor
# will fail if the editor is not installed.
store.add_dlc(fe.dlc)
persistent.editor = fe.name
fancy_activate_editor()
@@ -529,31 +469,10 @@ init 1 python in editor:
try:
e = renpy.editor.editor
return e.has_projects
except Exception:
except:
return False
def check_old_vscode_extension():
"""
Check to see if the old version of the Ren'Py vscode extension is installed.
"""
extensions = os.path.join(vscode_path(), "data", "extensions")
if not os.path.isdir(extensions):
return False
for i in util.listdir(extensions):
if i.lower().startswith("renpy.language-renpy-"):
return False
for i in util.listdir(extensions):
if i.lower().startswith("luquedaniel.languague-renpy-"):
return True
return False
screen editor:
frame:
@@ -583,9 +502,6 @@ screen editor:
for fe in editor.fancy_editors:
if fe.deprecated and not fe.installed:
continue
add SPACER
textbutton fe.name action editor.SelectEditor(fe.name)
@@ -597,10 +513,7 @@ screen editor:
has vbox
if fe.description:
text fe.description:
style "l_small_text"
if fe.deprecated:
color ERROR_COLOR
text fe.description style "l_small_text"
if not fe.installed:
add HALF_SPACER
@@ -609,73 +522,6 @@ screen editor:
textbutton _("Cancel") action Return(False) style "l_left_button"
label reinstall_vscode:
python hide:
manifest = "vscode"
renpy.invoke_in_new_context(installer.manifest, "https://www.renpy.org/extensions/{}/{}.py".format(manifest, manifest), renpy=True)
jump editor_preference
label upgrade_vscode_extension:
python hide:
manifest = "vscode"
renpy.invoke_in_new_context(installer.manifest, "https://www.renpy.org/extensions/vscode/upgrade_extension.py", renpy=True)
jump post_extension_check
label editor_preference:
call screen editor
jump preferences
default persistent.ignore_obsolete_editor = set()
# This label is called when the launcher starts, to check if the editor
# is obsolete, and let them change it.
label editor_check:
if persistent.editor in persistent.ignore_obsolete_editor:
jump post_editor_check
if persistent.editor == "Atom":
$ result = interface.choice(
_("The Atom text editor is no longer supported by its developers. We suggest switching to Visual Studio Code or another editor."), [
( "select", _("Select editor now.")),
( "ignore", _("Ignore until next launch.")),
( "block", _("Do not ask again.")),
], "select")
else:
jump post_atom_check
if result == "select":
$ renpy.pop_call()
jump editor_preference
elif result == "block":
$ persistent.ignore_obsolete_editor.add(persistent.editor)
label post_atom_check:
if "luquedaniel.languague-renpy" in persistent.ignore_obsolete_editor:
jump post_extension_check
if persistent.editor != "Visual Studio Code":
jump post_extension_check
if editor.check_old_vscode_extension():
$ result = interface.choice(
_("You are using an old version of the Ren'Py Language support for Visual Studio Code. Would you like to upgrade?"), [
( "upgrade", _("Upgrade.")),
( "ignore", _("Ignore until next launch.")),
( "block", _("Do not ask again.")),
], "select")
if result == "upgrade":
jump upgrade_vscode_extension
elif result == "block":
$ persistent.ignore_obsolete_editor.add("luquedaniel.languague-renpy")
label post_extension_check:
jump post_editor_check
+47 -32
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -25,6 +25,41 @@ init python:
import datetime
import os
import subprocess
class OpenDirectory(Action):
"""
Opens `directory` in a file browser. `directory` is relative to
the project root.
"""
alt = _("Open [text] directory.")
def __init__(self, directory, absolute=False):
if absolute:
self.directory = directory
else:
self.directory = os.path.join(project.current.path, directory)
def get_sensitive(self):
return os.path.exists(self.directory)
def __call__(self):
try:
directory = renpy.fsencode(self.directory)
if renpy.windows:
os.startfile(directory)
elif renpy.macintosh:
subprocess.Popen([ "open", directory ])
else:
subprocess.Popen([ "xdg-open", directory ])
except:
pass
# Used for testing.
def Relaunch():
renpy.quit(relaunch=True)
@@ -46,7 +81,7 @@ screen front_page:
right_margin 2
top_padding 20
bottom_padding 13
bottom_padding 26
side "t c b":
@@ -159,11 +194,11 @@ screen front_page_project:
frame style "l_indent":
has vbox
textbutton "game" action OpenDirectory(os.path.join(p.path, "game"), absolute=True)
textbutton "base" action OpenDirectory(os.path.join(p.path, "."), absolute=True)
textbutton "images" action OpenDirectory(os.path.join(p.path, "game/images"), absolute=True)
textbutton "audio" action OpenDirectory(os.path.join(p.path, "game/audio"), absolute=True)
textbutton "gui" action OpenDirectory(os.path.join(p.path, "game/gui"), absolute=True)
textbutton _("game") action OpenDirectory("game")
textbutton _("base") action OpenDirectory(".")
textbutton _("images") action OpenDirectory("game/images")
textbutton _("audio") action OpenDirectory("game/audio")
textbutton _("gui") action OpenDirectory("game/gui")
vbox:
if persistent.show_edit_funcs:
@@ -195,7 +230,7 @@ screen front_page_project:
has vbox
textbutton _("Navigate Script") action Jump("navigation")
textbutton _("Check Script (Lint)") action Call("lint")
textbutton _("Check Script (Lint)") action Jump("lint")
if project.current.exists("game/gui.rpy"):
textbutton _("Change/Update GUI") action Jump("change_gui")
@@ -216,7 +251,7 @@ screen front_page_project:
textbutton _("Android") action Jump("android")
textbutton _("iOS") action Jump("ios")
textbutton _("Web") action Jump("web")
textbutton _("Web") + " " + _("(Beta)") action Jump("web")
textbutton _("Generate Translations") action Jump("translate")
textbutton _("Extract Dialogue") action Jump("extract_dialogue")
@@ -227,27 +262,11 @@ label start:
show screen bottom_info
$ dmgcheck()
jump expression renpy.session.pop("launcher_start_label", "before_front_page")
jump expression renpy.session.pop("launcher_start_label", "front_page")
default persistent.has_chosen_language = False
default persistent.has_update = False
label before_front_page:
if (not persistent.has_chosen_language) or ("RENPY_CHOOSE_LANGUAGE" in os.environ):
if (_preferences.language is None) or ("RENPY_CHOOSE_LANGUAGE" in os.environ):
hide screen bottom_info
call choose_language
show screen bottom_info
$ persistent.has_chosen_language = True
call editor_check
label post_editor_check:
label front_page:
if persistent.daily_update_check and ((not persistent.last_update_check) or (datetime.date.today() > persistent.last_update_check)):
python hide:
persistent.last_update_check = datetime.date.today()
@@ -263,18 +282,14 @@ label lint:
interface.processing(_("Checking script for potential problems..."))
lint_fn = project.current.temp_filename("lint.txt")
persistent.lint_options.discard("--orphan-tl") # compat
persistent.lint_options.discard("--builtins-parameters") # compat
persistent.lint_options.discard("--words-char-count") # compat
project.current.launch([ 'lint', lint_fn, ] + list(persistent.lint_options), wait=True)
project.current.launch([ 'lint', lint_fn ], wait=True)
e = renpy.editor.editor
e.begin(True)
e.open(lint_fn)
e.end()
return
jump front_page
label rmpersistent:
+22 -69
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -22,10 +22,6 @@
define gui.project_system_font = None
define gui.asian = False
# This is set in new_project before new_template_project is called,
# and provides the full path to the template project.
default gui_template_path = None
init -1 python:
import gui7
@@ -35,7 +31,7 @@ init -1 python:
from store import config
def translate_font(language, font):
def translate_font(language, font, path=None):
"""
Selects the font file that is used when translating `language`.
@@ -43,17 +39,26 @@ init -1 python:
Is the name of the font file used for both the launcher and
the new GUI template. This should be a string giving the name
of the font file.
`path`
The path to the font file, relative to the launcher's game
directory. If not given, defaults to fonts.
"""
if path is None:
path = "fonts"
fullfont = path + "/" + font
def callback():
gui.REGULAR_FONT = font
gui.LIGHT_FONT = font
gui.REGULAR_FONT = fullfont
gui.LIGHT_FONT = fullfont
gui.REGULAR_BOLD = True
style._default.font = font
style.default.font = font
style._default.font = fullfont
style.default.font = fullfont
gui.system_font = font
gui.system_font = fullfont
gui.project_system_font = font
config.language_callbacks[language].append(callback)
@@ -61,7 +66,7 @@ init -1 python:
def s(s):
return '"' + s + '"'
gui7.translate_copy(language, "sdk-fonts/" + font, font)
gui7.translate_copy(language, fullfont, font)
gui7.translate_define(language, "gui.text_font", s(font))
gui7.translate_define(language, "gui.name_text_font", s(font))
gui7.translate_define(language, "gui.interface_text_font", s(font))
@@ -332,18 +337,15 @@ label gui_project_size:
python:
default_size = (1920, 1080)
gui_size = interface.choice(
_("What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of [default_size[0]]x[default_size[1]] is a reasonable compromise."),
_("What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."),
[
((1066, 600), "1066x600"),
((1280, 720), "1280x720"),
((1920, 1080), "1920x1080"),
((2560, 1440), "2560x1440"),
((3840, 2160), "3840x2160"),
("custom", _("Custom. The GUI is optimized for a 16:9 aspect ratio.")),
],
default_size,
(1280, 720),
cancel=Jump("front_page"),
)
@@ -360,7 +362,7 @@ label gui_project_size:
try:
gui_width = int(gui_width)
except Exception:
except:
interface.error(_("The width must be a number."), label=None)
continue
break
@@ -376,7 +378,7 @@ label gui_project_size:
try:
gui_height = int(gui_height)
except Exception:
except:
interface.error(_("The height must be a number."), label=None)
continue
break
@@ -452,52 +454,3 @@ label gui_generate_images:
project.current.launch([ 'gui_images' ], wait=True)
jump front_page
label new_template_project:
# Unused in new_template_project.
$ gui_size = (1920, 1080)
$ gui_color = (DARK_COLORS[0], "#000000", False)
python hide:
width, height = gui_size
accent, boring, light = gui_color
prefix = os.path.join(project_dir, "game")
template = os.path.join(gui_template_path, "game")
# Most of this isn't actually used.
p = gui7.GuiParameters(
prefix,
template,
width,
height,
accent,
boring,
light,
_preferences.language,
False,
True,
True,
project_name,
)
interface.processing(_("Creating the new project..."))
with interface.error_handling(_("creating a new project")):
gui7.generate_minimal(p)
# Activate the project.
with interface.error_handling(_("activating the new project")):
project.manager.scan()
project.Select(project.manager.get(project_name))()
call update_renpy_strings_common
python hide:
if gui.project_system_font:
with open(os.path.join(project.current.gamedir, "tl/None/common.rpym"), "ab") as f:
f.write("define gui.system_font = {!r}\r\n".format(gui.project_system_font).encode("utf-8"))
jump front_page
+9 -58
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -25,18 +25,8 @@ from gui7.parameters import GuiParameters
import renpy.arguments
import os
import shutil
def finish(p):
for dn in [ "images", "audio" ]:
fulldn = os.path.join(p.prefix, dn)
if not os.path.exists(fulldn):
os.mkdir(fulldn)
def generate_gui(p):
ImageGenerator(p).generate_all()
@@ -46,40 +36,12 @@ def generate_gui(p):
CodeGenerator(p).copy_script("script.rpy")
CodeGenerator(p).copy_files()
finish(p)
for dn in [ "images", "audio" ]:
fulldn = os.path.join(p.prefix, dn)
def generate_minimal(p):
# Copy the template over.
os.makedirs(os.path.dirname(p.prefix), 0o777)
shutil.copytree(p.template, p.prefix)
def delete(fn):
fn = os.path.join(p.prefix, fn)
if os.path.isdir(fn):
shutil.rmtree(fn)
elif os.path.exists(fn):
os.unlink(fn)
# Prune directories.
delete("cache")
delete("saves")
delete("tl")
# Prune files to be regenerated.
delete("gui.rpy")
delete("screens.rpy")
delete("options.rpy")
# Generate files.
CodeGenerator(p).generate_code("gui.rpy")
CodeGenerator(p).generate_code("screens.rpy")
CodeGenerator(p).generate_code("options.rpy")
CodeGenerator(p).copy_files()
finish(p)
if not os.path.exists(fulldn):
os.mkdir(fulldn)
def generate_gui_command():
@@ -98,9 +60,7 @@ def generate_gui_command():
ap.add_argument("--start", default=False, action="store_true", help="Starts a new project, replacing images and code.")
ap.add_argument("--replace-images", default=False, action="store_true", help="True if existing images should be overwritten.")
ap.add_argument("--replace-code", default=False, action="store_true", help="True if an existing gui.rpy file should be overwritten.")
ap.add_argument("--update-code", default=False, action="store_true", help="True if an existing gui.rpy file should be updated.")
ap.add_argument("--minimal", default=False, action="store_true", help="Only update option.rpy and translations.")
ap.add_argument("--update-code", default=False, action="store_true", help="True if an existing gui.rpy file should be update.")
args = ap.parse_args()
@@ -109,16 +69,10 @@ def generate_gui_command():
args.replace_code = True
args.update_code = True
if args.minimal:
args.replace_code = True
args.update_code = True
prefix = os.path.join(args.target, "game")
if os.path.exists(args.target):
if not os.path.isdir(prefix):
ap.error("{} does not appear to be a Ren'Py game.".format(prefix))
if not os.path.isdir(prefix):
ap.error("{} does not appear to be a Ren'Py game.".format(prefix))
template = os.path.join(args.template, "game")
@@ -140,9 +94,6 @@ def generate_gui_command():
os.path.basename(args.target),
)
if args.minimal:
generate_minimal(p)
else:
generate_gui(p)
generate_gui(p)
renpy.arguments.register_command("generate_gui", generate_gui_command)
+9 -19
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -121,13 +121,8 @@ class CodeGenerator(object):
else:
template = os.path.join(self.p.template, filename)
if not os.path.exists(template):
return False
else:
with codecs.open(template, "r", "utf-8") as f:
self.lines = [ i.rstrip().replace(u"\ufeff", "") for i in f ]
return True
with codecs.open(template, "r", "utf-8") as f:
self.lines = [ i.rstrip().replace(u"\ufeff", "") for i in f ]
def remove_scale(self):
@@ -172,7 +167,7 @@ class CodeGenerator(object):
for l in self.lines:
m = re.match(r'^(\s*)define (.*?) =', l)
m = re.match('^(\s*)define (.*?) =', l)
if m:
indent = m.group(1)
@@ -219,8 +214,7 @@ class CodeGenerator(object):
'gui.insensitive_color' : repr(self.p.insensitive_color.hexcode),
'gui.text_color' : repr(self.p.text_color.hexcode),
'gui.interface_text_color' : repr(self.p.text_color.hexcode),
'gui.choice_button_text_idle_color' : repr(self.p.idle_color.hexcode),
'gui.choice_button_text_insensitive_color' : repr(self.p.insensitive_color.hexcode),
'gui.choice_text_color' : repr(self.p.choice_color.hexcode),
}
self.update_defines(replacements, language_defines[self.p.language])
@@ -362,7 +356,7 @@ class CodeGenerator(object):
def copy_files(self):
for src, dst in language_copies[self.p.language]:
src = os.path.join(renpy.config.renpy_base, src)
src = os.path.join(renpy.config.gamedir, src)
dst = os.path.join(self.p.prefix, dst)
if os.path.exists(dst):
@@ -391,9 +385,7 @@ class CodeGenerator(object):
if not os.path.exists(src):
src = os.path.join(self.p.template, name)
if not self.load_template(src):
return
self.load_template(src)
self.remove_scale()
self.write_target(dst)
@@ -408,8 +400,7 @@ class CodeGenerator(object):
if not self.p.update_code:
return
if not self.load_template(fn):
return
self.load_template(fn)
if defines:
self.update_gui_defines()
@@ -430,8 +421,7 @@ class CodeGenerator(object):
if os.path.exists(target):
return
if not self.load_template(fn):
return
self.load_template(fn)
self.translate_strings()
self.translate_comments()
+9 -20
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -52,7 +52,7 @@ class ImageGenerator(object):
try:
os.mkdir(self.prefix, 0o777)
except Exception:
except:
pass
self.full_width = self.width / self.scale
@@ -121,7 +121,7 @@ class ImageGenerator(object):
try:
os.makedirs(dn, 0o777)
except Exception:
except:
pass
if os.path.exists(fn):
@@ -145,7 +145,12 @@ class ImageGenerator(object):
if not self.p.skip_backup:
os.rename(fn, bfn)
pygame_sdl2.image.save(s, fn, 3)
import cStringIO
sio = cStringIO.StringIO()
renpy.display.module.save_png(s, sio, 3)
with open(fn, "wb") as f:
f.write(sio.getvalue())
def make_surface(self, width, height):
return pygame_sdl2.Surface((width, height), pygame_sdl2.SRCALPHA)
@@ -404,21 +409,6 @@ class ImageGenerator(object):
self.save(s, "main_menu", overwrite=False)
self.save(s, "game_menu", overwrite=False)
def generate_bubble(self):
import shutil
for fn in [ "bubble.png", "thoughtbubble.png" ]:
source = os.path.join(config.renpy_base, "gui", "game", "gui", fn)
dest = os.path.join(self.prefix, fn)
if source == dest:
return
shutil.copyfile(source, dest)
def generate_all(self):
self.generate_textbox()
self.generate_choice_button()
@@ -430,7 +420,6 @@ class ImageGenerator(object):
self.generate_notify()
self.generate_menus()
self.generate_icon()
self.generate_bubble()
if __name__ == "__main__":
+5 -9
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -61,18 +61,14 @@ class GuiParameters(object):
self.muted_color = self.accent_color.shade(.4)
self.hover_muted_color = self.accent_color.shade(.6)
if light:
self.menu_color = self.accent_color.replace_hsv_saturation(.25).replace_value(.75)
else:
self.menu_color = self.accent_color.replace_hsv_saturation(.25).replace_value(.25)
self.menu_color = self.accent_color.replace_hsv_saturation(.25).replace_value(.5)
self.title_color = self.accent_color.replace_hsv_saturation(.5).replace_value(1.0)
if light:
self.selected_color = Color("#555555")
self.idle_color = Color("#707070")
self.idle_small_color = Color("#606060")
self.idle_color = Color("#aaaaaa")
self.idle_small_color = Color("#888888")
self.text_color = Color("#404040")
self.choice_color = Color("#cccccc")
@@ -103,7 +99,7 @@ class GuiParameters(object):
GOOD_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"
simple_name = "".join(i for i in name if i in GOOD_CHARACTERS)
simple_name = "".join(i for i in name if i in GOOD_CHARACTERS).encode("ascii")
if not simple_name:
simple_name = "game"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

+47 -63
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -62,7 +62,7 @@ init python:
if not os.path.exists(os.path.dirname(dstfn)):
try:
os.makedirs(os.path.dirname(dstfn))
except Exception:
except:
pass
renpy.write_log(fn + " -> " + dstfn)
@@ -73,7 +73,7 @@ init python:
try:
os.chmod(dstfn, 0o755)
except Exception:
except:
pass
interface.info(_("Successfully installed [name!t]."), name=name)
@@ -81,73 +81,26 @@ init python:
label install_live2d:
python hide:
if PY2:
_prefix = r"lib/py2-"
else:
_prefix = r"lib/py3-"
patterns = [
(r".*/Core/dll/linux/x86_64/(libLive2DCubismCore.so)", _prefix + r"linux-x86_64/\1"),
(r".*/Core/dll/windows/x86_64/(Live2DCubismCore.dll)", _prefix + r"windows-x86_64/\1"),
(r".*/Core/dll/macos/(libLive2DCubismCore.dylib)", _prefix + r"mac-universal/\1"),
(r".*/Core/dll/experimental/rpi/(libLive2DCubismCore.so)", _prefix + r"linux-armv7l/\1"),
(r".*/Core/dll/linux/x86_64/(libLive2DCubismCore.so)", r"lib/linux-x86_64/\1"),
(r".*/Core/dll/windows/x86_64/(Live2DCubismCore.dll)", r"lib/windows-x86_64/\1"),
(r".*/Core/dll/windows/x86/(Live2DCubismCore.dll)", r"lib/windows-i686/\1"),
(r".*/Core/dll/macos/(libLive2DCubismCore.dylib)", r"lib/mac-x86_64/\1"),
(r".*/Core/dll/experimental/rpi/(libLive2DCubismCore.so)", r"lib/linux-armv7l/\1"),
(r".*/Core/dll/android/(armeabi-v7a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
(r".*/Core/dll/android/(arm64-v8a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
(r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
# This doesn't exist yet.
# (r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
]
if PY2:
patterns.extend([
(r".*/Core/dll/windows/x86/(Live2DCubismCore.dll)", _prefix + r"windows-i686/\1"),
])
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-[45]-*.zip", patterns)
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-4-*.zip", patterns)
jump front_page
screen install_preferences():
frame:
style "l_indent"
has vbox
text _("This screen allows you to install libraries that can't be distributed with Ren'Py. Some of these libraries may require you to agree to a third-party license before being used or distributed.")
add SPACER
if not achievement.has_steam:
textbutton _("Install Steam Support"):
action Jump("install_steam")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}.")
else:
textbutton _("Install Steam Support")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Steam support has already been installed.")
add SPACER
textbutton _("Install Live2D Cubism SDK for Native"):
action Jump("prompt_live2d")
screen install_live2d():
screen install():
frame:
style_group "l"
@@ -172,6 +125,10 @@ screen install_live2d():
has vbox
text _("This screen allows you to install libraries that can't be distributed with Ren'Py. Some of these libraries may require you to agree to a third-party license before being used or distributed.")
add HALF_SPACER
add SPACER
textbutton _("Install Live2D Cubism SDK for Native"):
@@ -183,12 +140,39 @@ screen install_live2d():
style "l_indent"
has vbox
text _("The {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} adds support for displaying Live2D models. Place CubismSdkForNative-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc.")
text _("The {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} adds support for displaying Live2D models. Place CubismSdkForNative-4-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc.")
add SPACER
text _("Live2D in Ren'Py doesn't support the Web, Android x86_64 (including emulators and Chrome OS), and must be added to iOS projects manually. Live2D must be reinstalled after upgrading Ren'Py or installing Android support.")
add SPACER
if not achievement.has_steam:
textbutton _("Install Steam Support"):
action Jump("install_steam")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}.")
else:
textbutton _("Install Steam Support")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Steam support has already been installed.")
textbutton _("Cancel") action Return(False) style "l_left_button"
@@ -196,8 +180,8 @@ screen install_live2d():
timer 2.0 action renpy.restart_interaction repeat True
label prompt_live2d:
call screen install_live2d
label install:
call screen install
jump preferences
label install_steam:
-503
View File
@@ -1,503 +0,0 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import hashlib
import os
import time
import requests
import zipfile
import tarfile
import shutil
import subprocess
import renpy
import stat
VERSION = 1
# True if the installer should run in quiet mode.
quiet = False
from store import _, config, interface, project, Jump # type: ignore
temp_exists = False
def _ensure_temp():
"""
Ensures that the directories needed by the extension API are present.
"""
global temp_exists
if temp_exists:
return
backups = os.path.join(config.renpy_base, "tmp", "installer", "backups")
try:
if not os.path.exists(backups):
os.makedirs(os.path.dirname(backups))
except Exception:
pass
temp_exists = True
# The target directory that the extensions API operates on.
target = None
def set_target(directory):
"""
This sets the directory that the extension API targets. This is where
packages are unpacked to and the default working directory where the
programs are run.
"""
global target
target = directory
_clean("temp:", 3)
def _path(filename):
"""
Returns the full path to `filename`. If `filename` starts with the
prefix temp:, it's placed in the temp directory. If the filename
starts with backup, a backup filename is returned. Otherwise,
the path is interpreted relative to the target directory.
"""
_ensure_temp()
tempdir = os.path.join(config.renpy_base, "tmp", "installer")
backups = os.path.join(config.renpy_base, "tmp", "installer", "backups")
prefix, _, rest = filename.partition(":")
if prefix == "temp":
return os.path.join(tempdir, rest)
if prefix == "backup":
base = os.path.basename(rest.rpartition(":")[2])
return os.path.join(backups, base + "." + str(time.time()))
if prefix == "renpy":
return os.path.join(config.renpy_base, rest)
if target is None:
raise Exception("The target directory has not been set.")
return os.path.join(target, filename)
def _clean(directory, age=3):
"""
Removes files from `directory` that are older than `age` days.
"""
directory = _path(directory)
for root, dirs, files in os.walk(directory, topdown=False):
for f in files:
filename = os.path.join(root, f)
mtime = os.stat(filename).st_mtime
if time.time() - mtime > age * 86400:
try:
os.unlink(filename)
except Exception:
pass
if root != directory:
try:
os.rmdir(root)
except Exception:
pass
def _friendly(filename):
"""
Returns a version of the filename without any leading prefix.
"""
return filename.rpartition(":")[2]
def _check_hash(filename, hashj):
"""
Returns a cryptographic hash of `filename`. `filename` should
be a full path, one returned by temp or path.
"""
try:
sha = hashlib.sha256()
with open(filename, "rb") as f:
while True:
data = f.read(1024 * 1024)
if not data:
break
sha.update(data)
return sha.hexdigest() == hash
except Exception:
return False
# The name and url of the file that is currently being downloaded. This is meant to
# to be used by the interface screens to show the user what files are being
# downloaded.
download_file = ""
download_url = ""
def download(url, filename, hash=None, headers=None, requests_kwargs={}):
"""
Downloads `url` to `filename`, a tempfile.
"""
global download_url
global download_file
download_url = url
download_file = _friendly(filename)
filename = _path(filename)
if hash is not None:
if _check_hash(filename, hash):
return
progress_time = time.time()
all_headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 renpy/8'}
if headers:
all_headers.update(headers)
try:
response = requests.get(url, stream=True, proxies=renpy.exports.proxies, timeout=15, headers=all_headers, **requests_kwargs)
response.raise_for_status()
total_size = int(response.headers.get('content-length', 1))
downloaded = 0
with open(filename, "wb") as f:
for i in response.iter_content(65536):
f.write(i)
downloaded += len(i)
if time.time() - progress_time > 0.1:
progress_time = time.time()
if not quiet:
interface.processing(
_("Downloading [installer.download_file]..."),
complete=downloaded, total=total_size)
except requests.HTTPError as e:
if not quiet:
raise
interface.error(_("Could not download [installer.download_file] from [installer.download_url]:\n{b}[installer.download_error]"))
if hash is not None:
if not quiet:
raise Exception("Hash check failed.")
if not _check_hash(filename, hash):
interface.error(_("The downloaded file [installer.download_file] from [installer.download_url] is not correct."))
class _FixedZipFile(zipfile.ZipFile):
"""
A patched version of zipfile.ZipFile that adds support for:
* Unix permissions bits.
* Unix symbolic links.
"""
def _extract_member(self, member, targetpath, pwd):
if not isinstance(member, zipfile.ZipInfo):
member = self.getinfo(member)
# build the destination pathname, replacing
# forward slashes to platform specific separators.
arcname = member.filename.replace('/', os.path.sep)
if os.path.altsep:
arcname = arcname.replace(os.path.altsep, os.path.sep)
# interpret absolute pathname as relative, remove drive letter or
# UNC path, redundant separators, "." and ".." components.
arcname = os.path.splitdrive(arcname)[1]
invalid_path_parts = ('', os.path.curdir, os.path.pardir)
arcname = os.path.sep.join(x for x in arcname.split(os.path.sep) if x not in invalid_path_parts)
targetpath = os.path.join(targetpath, arcname)
targetpath = os.path.normpath(targetpath)
# Create all upper directories if necessary.
upperdirs = os.path.dirname(targetpath)
if upperdirs and not os.path.exists(upperdirs):
os.makedirs(upperdirs)
if member.filename.endswith("/"):
if not os.path.isdir(targetpath):
os.mkdir(targetpath)
return targetpath
attr = member.external_attr >> 16
if stat.S_ISLNK(attr):
with self.open(member, pwd=pwd) as source:
linkto = source.read()
os.symlink(linkto, targetpath)
else:
with self.open(member, pwd=pwd) as source, open(targetpath, "wb") as target:
shutil.copyfileobj(source, target)
if attr:
os.chmod(targetpath, attr)
return targetpath
# The name of the archive being unpacked.
unpack_archive = ""
def unpack(archive, destination):
"""
Unpacks `archive` to `destination`. `archive` should be the name of
a zip or (perhaps compressed) tar file. `destination` should be a
directory that the contents are unpacked into.
"""
global unpack_archive
unpack_archive = _friendly(archive)
if not quiet:
interface.processing(_("Unpacking [installer.unpack_archive]..."))
archive = _path(archive)
destination = _path(destination)
if not os.path.exists(destination):
os.makedirs(destination)
old_cwd = os.getcwd()
try:
os.chdir(destination)
if tarfile.is_tarfile(archive):
tar = tarfile.open(archive)
tar.extractall(".")
tar.close()
elif zipfile.is_zipfile(archive):
zip = _FixedZipFile(archive)
zip.extractall(".")
zip.close()
else:
raise Exception("Unknown file type.")
finally:
os.chdir(old_cwd)
def exists(filename):
"""
Returns true if `filename` exists.
"""
return os.path.exists(_path(filename))
def remove(filename):
"""
Removes a file or directory from the target directory, backing it up
the temporary directory.
"""
if not exists(filename):
return
backup = _path("backup:" + filename)
shutil.move(_path(filename), backup)
# Now, touch everything so _cleanup doesn't get it too quickly.
if os.path.isdir(backup):
for root, dirs, files in os.walk(backup):
for f in files:
try:
os.utime(os.path.join(root, f), None)
except Exception:
pass
else:
try:
os.utime(backup, None)
except Exception:
pass
def move(old_filename, new_filename):
"""
Moves a filename from `old_filename` to `new_filename`.
"""
remove(new_filename)
shutil.move(_path(old_filename), _path(new_filename))
def mkdir(dirname):
"""
Makes the named directory.
"""
if not os.path.exists(_path(dirname)):
os.makedirs(_path(dirname))
def info(message, **kwargs):
"""
Displays `message` to the user, asking them to click through or
cancel.
"""
interface.info(message, cancel=Jump("front_page"), **kwargs)
def processing(message, **kwargs):
"""
Displays `message` to the user, without waiting.
"""
interface.processing(message, **kwargs)
def error(message, **kwargs):
"""
Displays `message` to the user, as an error.
"""
interface.error(message)
install_args = [ ]
install_error = ""
def run(*args, **kwargs):
"""
Runs a program with the given arguments, in the target directory.
"""
environ = { renpy.exports.fsencode(k) : renpy.exports.fsencode(v) for k, v in os.environ.items() }
for k, v in kwargs.pop("environ", {}).items():
environ[renpy.exports.fsencode(k)] = renpy.exports.fsencode(v)
global install_args
global install_error
args = [ renpy.exports.fsencode(i) for i in args ]
try:
subprocess.check_call(args, cwd=target, env=environ) # type: ignore
except Exception as e:
install_args = args
install_error = str(e)
interface.error(_("Could not run [installer.install_args!r]:\n[installer.install_error]"))
_renpy = renpy
def manifest(url, renpy=False, insecure=False):
"""
Executes the manifest at `url`.
`renpy`
If true, the manifest applies to Ren'Py. If False, the manifest applies
to the current project.
`insecure`
If true, verificaiton is disabled.
"""
import ecdsa
download(url, "temp:manifest.py")
with open(_path("temp:manifest.py"), "rb") as f:
manifest = f.read()
if not insecure:
download(url + ".sig", "temp:manifest.py.sig")
with open(_path("temp:manifest.py.sig"), "rb") as f:
sig = f.read()
key = ecdsa.VerifyingKey.from_pem(_renpy.exports.open_file("renpy_ecdsa_public.pem").read())
if not key.verify(sig, manifest):
error(_("The manifest signature is not valid."))
return
if renpy:
set_target(config.renpy_base)
else:
if project.current is None:
error(_("No project has been selected."))
return
set_target(project.current.path)
exec(manifest.decode("utf-8"), {}, {})
def local_manifest(filename, renpy=False):
"""
Executes the manifest in `filename`.
`renpy`
If true, the manifest applies to Ren'Py. If False, the manifest applies
to the current project.
"""
if renpy:
set_target(config.renpy_base)
else:
if project.current is None:
error(_("No project has been selected."))
return
set_target(project.current.path)
with open(filename, "r") as f:
exec(f.read(), {}, {})
-12
View File
@@ -1,12 +0,0 @@
# This file imports the extensions API into the default store, and makes it
# also contains the strings used by the extensions API, so the Ren'Py translation
# framework can find them.
init python:
import installer
init python hide:
_("Downloading [extension.download_file].")
_("Could not download [extension.download_file] from [extension.download_url]:\n{b}[extension.download_error]")
_("The downloaded file [extension.download_file] from [extension.download_url] is not correct.")
+33 -47
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -22,49 +22,49 @@
################################################################################
# Interface actions.
init python in interface:
from store import OpenURL, config, Return, _preferences, persistent
from store import OpenURL, config, Return, _preferences
import store
import os.path
import contextlib
RENPY_URL = "http://www.renpy.org"
DOC_PATH = os.path.join(config.renpy_base, "doc/")
RENPY_GAMES_URL = "http://games.renpy.org"
DOC_PATH = os.path.join(config.renpy_base, "doc/index.html")
DOC_URL = "http://www.renpy.org/doc/html/"
DOC_LOCAL_URL = "file:///" + DOC_PATH
# If true, the launcher should not link back to renpy.org.
NO_LAUNCHER_LINKS = os.path.exists(os.path.join(config.renpy_base, "no_launcher_links.txt"))
LICENSE_PATH = os.path.join(config.renpy_base, "doc/license.html")
LICENSE_URL = "http://www.renpy.org/doc/html/license.html"
if os.path.exists(DOC_PATH):
DOC_LOCAL_URL = "file:///" + DOC_PATH
else:
DOC_LOCAL_URL = None
local_doc_exists = os.path.exists(DOC_PATH)
if os.path.exists(LICENSE_PATH):
LICENSE_LOCAL_URL = "file:///" + LICENSE_PATH
else:
LICENSE_LOCAL_URL = None
def get_doc_url(page):
"""
Returns the URL to the documentation page.
"""
if local_doc_exists and (NO_LAUNCHER_LINKS or not persistent.use_web_doc):
from urllib.parse import urljoin
from urllib.request import pathname2url
return urljoin('file:', pathname2url(DOC_PATH + page))
else:
return DOC_URL + page
def OpenDocumentation(page="index.html"):
def OpenDocumentation():
"""
An action that opens the documentation.
"""
return OpenURL(get_doc_url(page))
if DOC_LOCAL_URL is not None:
return OpenURL(DOC_LOCAL_URL)
else:
return OpenURL(DOC_URL)
def OpenLicense():
"""
An action that opens the license.
"""
return OpenDocumentation("license.html")
if LICENSE_LOCAL_URL is not None:
return OpenURL(LICENSE_LOCAL_URL)
else:
return OpenURL(LICENSE_URL)
def get_sponsor_url():
"""
@@ -89,10 +89,6 @@ init python in interface:
finally:
links = True
# Version.
import re
version = re.sub(r'\.\d+(\w*)$', r'\1', renpy.version())
# This displays the bottom of the screen. If the tooltip is not None, this displays the
# tooltip. Otherwise, it displays a list of links (to various websites, and to the
# preferences and update screen), or is just blank.
@@ -121,11 +117,9 @@ screen bottom_info:
hbox:
spacing INDENT
textbutton _("Documentation") style "l_link" action interface.OpenDocumentation()
if not interface.NO_LAUNCHER_LINKS:
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
textbutton _("[interface.version]") style "l_link" action Jump("about")
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
textbutton _("Ren'Py Games List") style "l_link" action OpenURL(interface.RENPY_GAMES_URL)
textbutton _("About") style "l_link" action Jump("about")
hbox:
spacing INDENT
@@ -140,7 +134,7 @@ screen bottom_info:
textbutton _("preferences") style "l_link" action Jump("preferences")
textbutton _("quit") style "l_link" action Quit(confirm=False)
if persistent.sponsor_message and not interface.NO_LAUNCHER_LINKS:
if persistent.sponsor_message:
textbutton _("Ren'Py Sponsor Information"):
style "l_link"
@@ -174,7 +168,7 @@ screen common:
has vbox
text message:
textalign 0.5
text_align 0.5
xalign 0.5
layout "subtitle"
@@ -204,15 +198,7 @@ screen common:
add SPACER
for v, l in choices:
textbutton l:
action SetScreenVariable("selected", v)
selected_background REVERSE_IDLE
selected_hover_background REVERSE_HOVER
xpadding 20
size_group "choice"
text_selected_idle_color REVERSE_TEXT
text_selected_hover_color REVERSE_TEXT
text_xalign 0.5
textbutton l action SetScreenVariable("selected", v)
if selected is not None:
$ continue_ = Return(selected)
@@ -223,7 +209,7 @@ screen common:
add SPACER
text submessage:
textalign 0.5
text_align 0.5
xalign 0.5
layout "subtitle"
@@ -262,7 +248,7 @@ screen launcher_input:
has vbox
text message:
textalign 0.5
text_align 0.5
xalign 0.5
layout "subtitle"
@@ -451,7 +437,7 @@ init python in interface:
try:
rv.encode("ascii")
except Exception:
except:
error(_("File and directory names must consist of ASCII characters."), label=None)
continue
@@ -496,7 +482,7 @@ init python in interface:
The amount of time to pause for after showing the message.
"""
common(title, store.INTERACTION_COLOR, message, submessage=submessage, pause=pause, show_screen=True, **kwargs)
common(title, store.INTERACTION_COLOR, message, submessage=None, pause=pause, show_screen=True, **kwargs)
renpy.pause(pause)
def processing(message, submessage=None, complete=None, total=None, **kwargs):
+9 -51
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -59,7 +59,6 @@ init python:
if RENIOS_PATH:
import renios.create
import renios.image
import renios.interface
def IOSState():
if not RENIOS_PATH:
@@ -124,19 +123,17 @@ init python:
return os.path.join(persistent.xcode_projects_directory, xcode_name(p.name))
def ios_create(p=None, gui=True, target=None):
if p is None:
p = project.current
p.update_dump(force=True, gui=gui)
project.current.update_dump(force=True, gui=gui)
name = p.dump.get("name", None)
version = p.dump.get("version", None)
name = project.current.dump.get("name", None)
version = project.current.dump.get("version", None)
dest = xcode_project(p, target)
if gui:
iface = MobileInterface("ios")
else:
iface = renios.interface.Interface()
iface = rapt.interface.Interface()
if os.path.exists(dest):
if not iface.yesno(_("The Xcode project already exists. Would you like to rename the old project, and replace it with a new one?")):
@@ -155,33 +152,6 @@ init python:
ios_populate(p, gui=gui, target=target)
def eliminate_pycache(directory):
"""
Eliminates the __pycache__ directory, and moves the files in it up a level,
renaming them to remove the cache tag.
"""
print("Eliminating __pycache__...")
if PY2:
return
import pathlib
import sys
paths = list(pathlib.Path(directory).glob("**/__pycache__/*.pyc"))
for p in paths:
name = p.stem.partition(".")[0]
p.rename(p.parent.parent / (name + ".pyc"))
paths = list(pathlib.Path(directory).glob("**/__pycache__"))
for p in paths:
p.rmdir()
def ios_populate(p=None, gui=True, target=None):
"""
This actually builds the package.
@@ -211,8 +181,6 @@ init python:
report_success=False,
)
eliminate_pycache(dist)
main_fn = os.path.join(dist, "main.py")
for fn in os.listdir(dist):
@@ -244,17 +212,10 @@ init python:
def launch_xcode():
dist = xcode_project(None)
name = project.current.dump.get("name", None)
xcodeproj = "{}/{}.xcodeproj".format(dist, name)
if not os.path.exists(dist):
return
for fn in os.listdir(dist):
if fn.endswith(".xcodeproj"):
xcodeproj = os.path.join(dist, fn)
subprocess.call([ 'open', renpy.fsencode(xcodeproj) ])
break
subprocess.call([ 'open', renpy.fsencode(xcodeproj) ])
screen ios:
@@ -339,10 +300,6 @@ screen ios:
action IOSIfState(state, IOS_OK, launch_xcode)
hovered tt.Action(IOS_XCODE_TEXT)
add SPACER
textbutton _("Force Recompile") action DataToggle("force_recompile") style "l_checkbox"
add SPACER
add SEPARATOR2
@@ -458,3 +415,4 @@ init python:
return False
renpy.arguments.register_command("ios_populate", ios_populate_command)
+36 -13
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -23,8 +23,6 @@ init python:
def find_itch_butler():
import requests
if renpy.windows:
platform = "windows-amd64"
exe = "butler.exe"
@@ -46,16 +44,23 @@ init python:
try:
os.makedirs(dn)
except Exception:
except:
pass
with interface.error_handling(_("Downloading the itch.io butler.")):
url = "https://broth.itch.zone/butler/{}/LATEST/archive/default".format(platform)
import urllib2
response = requests.get(url, headers={'User-Agent' : "Renpy"}, proxies=renpy.proxies)
with interface.error_handling(_("Downloading the itch.io butler.")):
url = "https://broth.itch.ovh/butler/{}/LATEST/archive/default".format(platform)
req = urllib2.Request(url, headers={'User-Agent' : "Renpy"})
response = urllib2.urlopen(req, context=ssl_context())
with open(zip, "wb") as f:
f.write(response.content)
while True:
data = response.read(1024 * 1024)
if not data:
break
f.write(data)
import zipfile
@@ -64,7 +69,7 @@ init python:
try:
os.chmod(exe, 0o755)
except Exception:
except:
pass
return exe
@@ -97,14 +102,32 @@ label itch:
files = [ ]
for fn in os.listdir(destination):
fn = os.path.join(destination, fn)
if fn.endswith("-all.zip"):
channel = "win-osx-linux"
elif fn.endswith("-market.zip"):
channel = "win-osx-linux"
elif fn.endswith("-pc.zip"):
channel = "win-linux"
elif fn.endswith("-win.zip"):
channel = "win"
elif fn.endswith("-mac.zip"):
channel = "osx"
elif fn.endswith("-linux.tar.bz2"):
channel = "linux"
elif fn.endswith("-release.apk"):
channel = "android"
for pattern, channel in reversed(build['itch_channels'].items()):
if fnmatch.fnmatch(fn, pattern):
break
else:
continue
fn = os.path.join(destination, fn)
files.append((fn, channel))
if not os.path.exists(destination):
+3 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -23,7 +23,7 @@ init python hide:
import os
macapp = os.path.join(config.renpy_base, "renpy.app/Contents/MacOS")
maclib = os.path.join(config.renpy_base, distribute.py("lib/py{major}-mac-universal"))
maclib = os.path.join(config.renpy_base, "lib/mac-x86_64")
if os.path.exists(maclib):
@@ -45,7 +45,7 @@ init python hide:
os.chmod(nfn, 0o755)
os.unlink(fn)
except Exception:
except:
pass
+10 -16
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -32,7 +32,7 @@ init -1 python:
if not renpy.loadable(fn1):
return True
hash1 = renpy.open_file(fn1, encoding="utf-8").read()
hash1 = renpy.file(fn1).read()
if not os.path.exists(fn2):
return False
@@ -99,10 +99,6 @@ init -1 python:
interface.processing(prompt, pause=False)
self.log(prompt)
def open_directory(self, directory, prompt):
renpy.run(store.OpenDirectory(directory, absolute=True))
interface.info(prompt)
def yesno(self, prompt, submessage=None):
return interface.yesno(prompt, submessage=submessage)
@@ -159,11 +155,12 @@ init -1 python:
try:
while self.run_yes:
self.process.stdin.write(b'y\n')
self.process.stdin.write('y\n')
self.process.stdin.flush()
time.sleep(.2)
except Exception:
pass
except:
import traceback
traceback.print_exc()
def call(self, cmd, cancel=False, use_path=False, yes=False):
@@ -173,7 +170,7 @@ init -1 python:
self.cmd = cmd
f = open(self.filename, "a")
f = open(self.filename, "ab")
f.write("\n\n\n")
@@ -199,7 +196,7 @@ init -1 python:
# avoid SIGTTIN caused by e.g. gradle doing empty read on terminal stdin
if not yes:
self.process.stdin.close()
except Exception:
except:
import traceback
traceback.print_exc(file=f)
raise
@@ -219,11 +216,7 @@ init -1 python:
if yes and self.yes_thread:
self.run_yes = False
self.yes_thread.join()
try:
self.process.stdin.close()
except Exception:
pass
self.process.stdin.close()
self.process = None
self.yes_thread = None
@@ -269,3 +262,4 @@ init -1 python:
self.process.terminate()
renpy.jump(self.platform)
+4 -15
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -19,9 +19,6 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Should translation files be shown in the launcher file navigation?
default persistent.show_translation_files = True
init python in navigation:
import store.interface as interface
import store.project as project
@@ -113,9 +110,6 @@ init python in navigation:
if shortfn.startswith("game/"):
shortfn = fn[5:]
if shortfn.startswith("tl/") and not persistent.show_translation_files:
continue
rv.append((shortfn, fn, None))
rv.sort()
@@ -161,8 +155,6 @@ init python in navigation:
screen navigation:
$ todo_count = len(project.current.dump.get("location", {}).get("todo", []))
frame:
style_group "l"
style "l_root"
@@ -209,7 +201,7 @@ screen navigation:
textbutton _("transforms") action navigation.ChangeKind("transform")
textbutton _("screens") action navigation.ChangeKind("screen")
textbutton _("callables") action navigation.ChangeKind("callable")
textbutton (__("TODOs") + " (" + str(todo_count) + ")") action navigation.ChangeKind("todo")
textbutton _("TODOs") action navigation.ChangeKind("todo")
add SPACER
add SEPARATOR
@@ -226,10 +218,6 @@ screen navigation:
vbox:
style_group "l_navigation"
if persistent.navigation == "file":
textbutton _("Show translation files") style "l_checkbox" action [ ToggleField(persistent, "show_translation_files"), Jump("navigation_loop") ]
add SPACER
for group_name, group in groups:
if group_name is not None:
@@ -261,7 +249,7 @@ screen navigation:
if persistent.navigation == "todo":
text _("No TODO comments found.\n\nTo create one, include \"# TODO\" in your script."):
textalign 0.5
text_align 0.5
xalign 0.5
yalign 0.5
@@ -291,3 +279,4 @@ label navigation_loop:
label navigation_refresh:
$ project.current.update_dump(True)
jump navigation_loop
+125 -16
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -25,6 +25,34 @@ init python:
import time
import re
def check_language_support():
language = _preferences.language
new = False
legacy = False
# Check for a translation of the words "New GUI Interface".
if (language is None) or (__("New GUI Interface") != "New GUI Interface"):
new = True
try:
if (language is None) or os.path.exists(os.path.join(config.renpy_base, "templates", language)):
legacy = True
except:
pass
if new and legacy:
store.language_support = _("Both interfaces have been translated to your language.")
elif new:
store.language_support = _("Only the new GUI has been translated to your language.")
elif legacy:
store.language_support = _("Only the legacy theme interface has been translated to your language.")
else:
store.language_support = _("Neither interface has been translated to your language.")
label new_project:
@@ -34,25 +62,23 @@ label new_project:
if persistent.projects_directory is None:
$ interface.error(_("The projects directory could not be set. Giving up."))
if PY2:
$ interface.info(_("Warning : you are using Ren'Py 7. It is recommended to start new projects using Ren'Py 8 instead."))
python:
new_project_language = __("{#language name and font}")
gui_kind = "new_gui_project"
if persistent.legacy:
# When translating this, feel free to replace [new_project_language] with the translation of your language.
interface.info(_("You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."), cancel=Jump("front_page"))
check_language_support()
python:
if project.manager.templates:
gui_kind, gui_template_path = interface.choice(
_("Please select a template project to use."),
[ ( ("new_gui_project", None), _("Do not use a template project.") ) ] +
[ ( ("new_template_project", p.path ), p.name) for p in project.manager.templates ],
("new_gui_project", None),
gui_kind = interface.choice(
_("Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."),
[ ( 'new_gui_project', _("New GUI Interface") ), ( 'new_theme_project', _("Legacy Theme Interface")) ],
"new_gui_project",
cancel=Jump("front_page"),
)
)
else:
new_project_language = (_preferences.language or "english").title()
gui_kind = "new_gui_project"
# When translating this, feel free to replace [new_project_language] with the translation of your language.
interface.info(_("You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."))
python:
project_name = ""
@@ -82,3 +108,86 @@ label new_project:
break
jump expression gui_kind
screen select_template:
default result = project.manager.get("english")
frame:
style_group "l"
style "l_root"
window:
has vbox
label _("Choose Project Template")
hbox:
frame:
style "l_indent"
xmaximum ONETHIRD
viewport:
scrollbars "vertical"
vbox:
for p in project.manager.templates:
textbutton "[p.name!q]" action SetScreenVariable("result", p) style "l_list"
frame:
style "l_indent"
xmaximum TWOTHIRDS
text _("Please select a template to use for your new project. The template sets the default font and the user interface language. If your language is not supported, choose 'english'.")
textbutton _("Return") action Jump("front_page") style "l_left_button"
textbutton _("Continue") action Return(result) style "l_right_button"
label new_theme_project:
python hide:
if len(project.manager.templates) == 1:
template = project.manager.templates[0]
else:
template = renpy.call_screen("select_template")
template_path = template.path
with interface.error_handling(_("creating a new project")):
shutil.copytree(template_path, project_dir, symlinks=False)
# Delete the tmp directory, if it exists.
if os.path.isdir(os.path.join(project_dir, "tmp")):
shutil.rmtree(os.path.join(project_dir, "tmp"))
# Delete project.json, which must exist.
os.unlink(os.path.join(project_dir, "project.json"))
# Change the save directory in options.rpy
fn = os.path.join(project_dir, "game/options.rpy")
with open(fn, "rb") as f:
options = f.read().decode("utf-8")
options = options.replace("PROJECT_NAME", project_name)
options = options.replace("UNIQUE", str(int(time.time())))
with open(fn, "wb") as f:
f.write(options.encode("utf-8"))
font = template.data.get("font", None)
if font is not None:
src = os.path.join(config.gamedir, "fonts", font)
dst = os.path.join(project_dir, "game", "tl", "None", font)
shutil.copy(src, dst)
# Activate the project.
with interface.error_handling(_("activating the new project")):
project.manager.scan()
project.Select(project.manager.get(project_name))()
call choose_theme_callable
jump front_page
+42 -97
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -30,9 +30,6 @@
init -1 python hide:
# Update the searchpath to find additional fonts.
config.searchpath.append(config.renpy_base + "/sdk-fonts")
# Should we enable the use of developer tools? This should be
# set to False before the game is released, so the user can't
# cheat using developer tools.
@@ -184,17 +181,9 @@ init -1 python hide:
#####################
# More customizations can go here.
config.has_sound = False
config.has_music = False
config.has_voice = False
config.force_sound = False
config.sound = False
config.quit_action = Quit(confirm=False)
if renpy.macintosh:
config.window_icon = "images/window-icon-mac.png"
else:
config.window_icon = "images/window-icon.png"
config.window_icon = "images/logo.png"
config.has_autosave = False
config.log_enable = False
config.mouse_hide_time = None
@@ -250,12 +239,10 @@ init python:
# allows the updater to run.
build.include_update = True
# Build both kinds of updates.
build.update_formats = [ "zsync", "rpu" ]
# Allow empty directories, so we can distribute the images directory.
build.exclude_empty_directories = False
# Mac signing options.
import os
build.mac_identity = os.environ.get("RENPY_MAC_IDENTITY", None)
@@ -280,8 +267,23 @@ init python:
build.classify_renpy("**/thumbs.db", None)
build.classify_renpy("**/.*", None)
# Atom rules. These have to be very early, since Atom uses names like
# tmp for packages.
build.classify_renpy("atom/", "atom-all source_only")
build.classify_renpy("atom/Atom.edit.py", "atom-all source_only")
build.classify_renpy("atom/default-dot-atom/**", "atom-all")
build.classify_renpy("atom/atom-windows/**", "atom-windows")
build.classify_renpy("atom/Atom.app/**", "atom-mac")
build.classify_renpy("atom/atom-linux**", "atom-linux")
try:
with open(os.path.join(config.renpy_base, "atom", "executable.txt")) as f:
for l in f:
build.executable(l.strip())
except:
pass
build.classify_renpy("rapt/**/libLive2DCubismCore.so", None)
build.classify_renpy("rapt/symbols/", None)
build.classify_renpy("rapt/**", "rapt")
build.executable("rapt/prototype/gradlew")
@@ -300,8 +302,7 @@ init python:
build.classify_renpy("**.old", None)
build.classify_renpy("**.new", None)
build.classify_renpy("**.bak", None)
build.classify_renpy("**.keystore", None)
build.classify_renpy("**.pyc", None)
build.classify_renpy("**/log.txt", None)
build.classify_renpy("**/traceback.txt", None)
@@ -314,70 +315,33 @@ init python:
# main source.
def source_and_binary(pattern, source="source", binary="binary", py=True):
def source_and_binary(pattern, source="source", binary="binary"):
"""
Classifies source and binary files beginning with `pattern`.
.pyo, .rpyc, .rpycm, and .rpyb go into binary, everything
else but .pyi files go into source.
else goes into source.
"""
if py is True:
py = 'pyo' if PY2 else 'pycache'
if py == 'pycache':
build.classify_renpy(pattern + "/**__pycache__/", binary)
build.classify_renpy(pattern + "/**__pycache__/*.{}.pyc".format(sys.implementation.cache_tag), binary)
build.classify_renpy(pattern + "/**.pyc", None)
build.classify_renpy(pattern + "/**.pyo", None)
elif py == 'pyc':
build.classify_renpy(pattern + "/**__pycache__/", None)
build.classify_renpy(pattern + "/**.pyc", binary)
build.classify_renpy(pattern + "/**.pyo", None)
elif py == 'pyo':
build.classify_renpy(pattern + "/**__pycache__/", None)
build.classify_renpy(pattern + "/**.pyc", None)
build.classify_renpy(pattern + "/**.pyo", binary)
else:
build.classify_renpy(pattern + "/**__pycache__/", None)
build.classify_renpy(pattern + "/**.pyc", None)
build.classify_renpy(pattern + "/**.pyo", None)
build.classify_renpy(pattern + "/**.pyi", None)
build.classify_renpy(pattern + "/**.pyo", binary)
build.classify_renpy(pattern + "/**.rpyc", binary)
build.classify_renpy(pattern + "/**.rpymc", binary)
build.classify_renpy(pattern + "/**/" + renpy.script.BYTECODE_FILE, binary)
build.classify_renpy(pattern + "/**/cache/bytecode-*.rpyb", None)
build.classify_renpy(pattern + "/**/cache/*", binary)
build.classify_renpy(pattern + "/**", source)
build.classify_renpy("renpy.py", "binary")
source_and_binary("renpy")
# games.
build.classify_renpy("launcher/game/theme/", None)
build.classify_renpy("gui/game/gui/", None)
build.classify_renpy("gui/game/gui/", "source")
build.classify_renpy("gui/game/gui/bubble.png", "source")
build.classify_renpy("gui/game/gui/thoughtbubble.png", "source")
build.classify_renpy("gui/game/gui/*", None)
source_and_binary("launcher", py=False)
source_and_binary("gui", binary=None, py=False)
source_and_binary("launcher")
source_and_binary("gui", binary=None)
source_and_binary("the_question")
source_and_binary("tutorial")
# extra fonts.
build.classify_renpy("sdk-fonts/**", "source")
# docs.
build.classify_renpy("doc/", "source")
build.classify_renpy("doc/.doctrees/", None)
@@ -406,48 +370,38 @@ init python:
build.classify_renpy("module/pysdlsound/*.py", "source")
build.classify_renpy("module/pysdlsound/*.pyx", "source")
build.classify_renpy("module/fribidi-src/**", "source")
build.classify_renpy("module/tinyfiledialogs/**", "source")
build.classify_renpy("module/libhydrogen/**", "source")
# all-platforms binary.
build.classify_renpy("lib/**/libpython{}.{}.dll".format(sys.version_info.major, sys.version_info.minor), "binary")
build.classify_renpy("lib/**/libpython*.dll", None)
build.classify_renpy("lib/**/_renpysteam*", "steam")
build.classify_renpy("lib/**/*steam_api*", "steam")
build.classify_renpy("lib/**/*Live2D*", None)
build.classify_renpy("lib/linux-armv7l/", "raspi")
build.classify_renpy("lib/linux-armv7l/**", "raspi")
build.classify_renpy("lib/**", "binary")
build.classify_renpy("renpy.sh", "binary")
# renpy.app is now built from scratch from distribute.rpy.
libpython = "lib/python{}.{}".format(sys.version_info.major, sys.version_info.minor)
if PY2:
build.classify_renpy("lib/py2-linux-armv7l/**", "linux_arm")
build.classify_renpy("lib/py2-linux-aarch64/**", "linux_arm")
source_and_binary("lib/py2-**", "binary", "binary")
source_and_binary("lib/python2**", "binary", "binary")
build.classify_renpy("renpy2.sh", "binary")
else:
build.classify_renpy("lib/py3-linux-armv7l/**", "linux_arm")
build.classify_renpy("lib/py3-linux-aarch64/**", "linux_arm")
source_and_binary("lib/py3-**", "binary", "binary")
source_and_binary("lib/python3**", "binary", "binary", py='pyc')
build.classify_renpy("renpy3.sh", "binary")
build.classify_renpy("lib/", "binary")
# jedit rules.
build.classify_renpy("jedit/**", "jedit")
# Packages.
build.packages = [ ]
build.package("sdk", "zip tar.bz2 dmg", "source binary")
build.package("sdkarm", "tar.bz2", "source binary linux_arm")
build.package("source", "tar.bz2", "source source_only", update=False)
build.package("raspi", "tar.bz2", "raspi", dlc=True, update=False)
build.package("steam", "zip", "steam", dlc=True)
build.package("jedit", "zip", "jedit", dlc=True)
build.package("atom-linux", "tar.bz2", "atom-all atom-linux", dlc=True)
build.package("atom-mac", "zip", "atom-all atom-mac", dlc=True)
build.package("atom-windows", "zip", "atom-all atom-windows", dlc=True)
build.package("rapt", "zip", "rapt", dlc=True)
build.package("renios", "zip", "renios", dlc=True)
build.package("web", "zip", "web", dlc=True)
# The identifier for the SDK.
define build.mac_info_plist["CFBundleIdentifier"] = "org.renpy.sdk"
# Enable the special launcher translation mode.
define config.translate_launcher = True
@@ -458,16 +412,7 @@ define config.mouse_focus_clickthrough = True
# Reduce the rate of screen updates.
default preferences.gl_powersave = True
# Enable rtl.
define config.rtl = True
# Disable steam.
python early:
config.enable_steam = False
# Since the launcher can be run directly or can be run from the SDK directory,
# uneliding files needs to be handled slightly differently.
define config.alternate_unelide_path = os.path.join(config.basedir, "launcher")
# Disable skipping.
define config.allow_skipping = False
+82 -144
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -31,109 +31,96 @@ init python in distribute:
import sys
import threading
from renpy import six
from zipfile import crc32
# Since the long type doesn't exist on py3, define it here
if not PY2:
if six.PY3:
long = int
zlib.Z_DEFAULT_COMPRESSION = 5
if PY2:
class ZipFile(zipfile.ZipFile):
class ZipFile(zipfile.ZipFile):
def write_with_info(self, zinfo, filename):
"""Put the bytes from filename into the archive under the name
arcname."""
if not self.fp:
raise RuntimeError(
"Attempt to write to ZIP archive that was already closed")
def write_with_info(self, zinfo, filename):
"""Put the bytes from filename into the archive under the name
arcname."""
if not self.fp:
raise RuntimeError(
"Attempt to write to ZIP archive that was already closed")
st = os.stat(filename)
isdir = stat.S_ISDIR(st.st_mode)
st = os.stat(filename)
isdir = stat.S_ISDIR(st.st_mode)
zinfo.file_size = st.st_size
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell() # Start of header bytes
zinfo.file_size = st.st_size
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell() # Start of header bytes
self._writecheck(zinfo)
self._didModify = True
self._writecheck(zinfo)
self._didModify = True
if isdir:
zinfo.file_size = 0
zinfo.compress_size = 0
zinfo.CRC = 0
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
self.fp.write(zinfo.FileHeader())
return
if isdir:
zinfo.file_size = 0
zinfo.compress_size = 0
zinfo.CRC = 0
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
self.fp.write(zinfo.FileHeader())
return
with open(filename, "rb") as fp:
# Must overwrite CRC and sizes with correct data later
zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
file_size = 0
with open(filename, "rb") as fp:
# Must overwrite CRC and sizes with correct data later
zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
file_size = 0
zip64 = self._allowZip64 and \
zinfo.file_size * 1.05 > zipfile.ZIP64_LIMIT
self.fp.write(zinfo.FileHeader(zip64))
if zinfo.compress_type == zipfile.ZIP_DEFLATED:
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
else:
cmpr = None
while 1:
buf = fp.read(1024 * 1024)
if not buf:
break
file_size = file_size + len(buf)
CRC = crc32(buf, CRC) & 0xffffffff
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)
self.fp.write(buf)
if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
self.fp.write(buf)
zinfo.compress_size = compress_size
else:
zinfo.compress_size = file_size
zinfo.CRC = CRC
zinfo.file_size = file_size
if not zip64 and self._allowZip64:
if file_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('File size has increased during compressing')
if compress_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('Compressed size larger than uncompressed size')
# Seek backwards and write CRC and file sizes
position = self.fp.tell() # Preserve current position in file
self.fp.seek(zinfo.header_offset, 0)
zip64 = self._allowZip64 and \
zinfo.file_size * 1.05 > zipfile.ZIP64_LIMIT
self.fp.write(zinfo.FileHeader(zip64))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
else:
class ZipFile(zipfile.ZipFile):
def write_with_info(self, zinfo, filename):
if zinfo.filename.endswith("/"):
data = b''
if zinfo.compress_type == zipfile.ZIP_DEFLATED:
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
else:
with open(filename, "rb") as f:
data = f.read()
cmpr = None
while 1:
buf = fp.read(1024 * 1024)
if not buf:
break
file_size = file_size + len(buf)
CRC = crc32(buf, CRC) & 0xffffffff
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)
self.fp.write(buf)
if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
self.fp.write(buf)
zinfo.compress_size = compress_size
else:
zinfo.compress_size = file_size
zinfo.CRC = CRC
zinfo.file_size = file_size
self.writestr(zinfo, data)
if not zip64 and self._allowZip64:
if file_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('File size has increased during compressing')
if compress_size > zipfile.ZIP64_LIMIT:
raise RuntimeError('Compressed size larger than uncompressed size')
# Seek backwards and write CRC and file sizes
position = self.fp.tell() # Preserve current position in file
self.fp.seek(zinfo.header_offset, 0)
self.fp.write(zinfo.FileHeader(zip64))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
class ZipPackage(object):
@@ -157,7 +144,7 @@ init python in distribute:
# Check that the time is sensible.
if rv[0] < 2000:
rv = None
except Exception:
except:
rv = None
if rv is None:
@@ -194,7 +181,7 @@ init python in distribute:
self.zipfile.write_with_info(zi, path)
def close(self, progress=None):
def close(self):
self.zipfile.close()
@@ -206,7 +193,7 @@ init python in distribute:
If true, times will be forced to the epoch.
"""
self.tarfile = tarfile.open(filename, mode, format=tarfile.PAX_FORMAT)
self.tarfile = tarfile.open(filename, mode)
self.tarfile.dereference = True
self.notime = notime
@@ -242,10 +229,9 @@ init python in distribute:
def add_directory(self, name, path):
self.add_file(name, path, True)
def close(self, progress=None):
def close(self):
self.tarfile.close()
class UpdatePackage(TarPackage):
def __init__(self, filename, basename, destination):
@@ -255,7 +241,7 @@ init python in distribute:
TarPackage.__init__(self, filename, "w", notime=True)
def close(self, progress=None):
def close(self):
TarPackage.close(self)
cmd = [
@@ -283,6 +269,7 @@ init python in distribute:
sums.write(struct.pack("<I", zlib.adler32(data) & 0xffffffff))
class DirectoryPackage(object):
def mkdir(self, path):
@@ -314,10 +301,9 @@ init python in distribute:
fn = os.path.join(self.path, name)
self.mkdir(fn)
def close(self, progress=None):
def close(self):
return
class ExternalZipPackage(object):
def __init__(self, path):
@@ -331,7 +317,7 @@ init python in distribute:
def add_directory(self, name, path):
self.dp.add_directory(name, path)
def close(self, progress=None):
def close(self):
self.dp.close()
if os.path.exists(self.path):
@@ -350,65 +336,17 @@ init python in distribute:
shutil.rmtree(self.directory)
class DMGPackage(DirectoryPackage):
def __init__(self, path, make_dmg):
self.make_dmg = make_dmg
DirectoryPackage.__init__(self, path)
def close(self, progress=None):
def close(self):
DirectoryPackage.close(self)
self.make_dmg()
class RPUPackage(object):
generator = None
def __init__(self, directory, variant):
import renpy.update.common
self.directory = directory + "/rpu"
self.variant = variant
self.file_list = renpy.update.common.FileList()
if not os.path.exists(self.directory):
os.mkdir(self.directory)
def add_file(self, name, path, xbit):
self.file_list.add_file(name, path, xbit)
def add_directory(self, name, _path):
self.file_list.add_directory(name)
def close(self, progress=None):
import renpy.update.generate
if RPUPackage.generator is None:
RPUPackage.generator = renpy.update.generate.BlockGenerator(self.directory)
RPUPackage.generator.generate(self.variant, self.file_list, progress)
@staticmethod
def reset():
RPUPackage.generator = None
class NullPackage(object):
"""
A package format that doesn't create an output file,
only updates.
"""
def add_file(self, name, path, xbit):
return
def add_directory(self, name, _path):
return
def close(self, progress=None):
return
parallel_threads = [ ]
class ParallelPackage(object):
@@ -426,7 +364,7 @@ init python in distribute:
def add_directory(self, name, path):
self.worklist.append((True, name, path, True))
def close(self, progress=None):
def close(self):
t = threading.Thread(target=self.run)
t.start()
File diff suppressed because it is too large Load Diff
+159 -374
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -19,91 +19,53 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
default persistent.show_edit_funcs = True
default persistent.windows_console = False
default persistent.lint_options = set()
default persistent.use_web_doc = False
init python:
from math import ceil
if persistent.show_edit_funcs is None:
persistent.show_edit_funcs = True
def scan_translations(piglatin=True):
if persistent.windows_console is None:
persistent.windows_console = False
def scan_translations():
languages = renpy.known_languages()
if not languages:
return None
languages.remove("piglatin")
rv = [ ( "English", None) ]
rv = [(i, renpy.translate_string("{#language name and font}", i)) for i in languages ]
rv.sort(key=lambda a : renpy.filter_text_tags(a[1], allow=[]).lower())
for i in languages:
rv.append((i.title(), i))
rv.insert(0, (None, "English"))
for i in (("Schinese", "schinese"), ("Tchinese", "tchinese")):
if i in rv:
rv.remove(i)
rv.append(({"schinese": "Simplified Chinese", "tchinese": "Traditional Chinese"}.get(i[1]), i[1]))
if piglatin:
rv.append(("piglatin", "Igpay Atinlay"))
rv.sort()
bound = ceil(len(rv)/3.)
return (rv[:bound], rv[bound:2*bound], rv[2*bound:])
if ("Piglatin", "piglatin") in rv:
rv.remove(("Piglatin", "piglatin"))
rv.append(("Pig Latin", "piglatin"))
return rv
show_legacy = os.path.exists(os.path.join(config.renpy_base, "templates", "english", "game", "script.rpy"))
class RestartAtPreferences(Action):
def __call__(self):
renpy.session["launcher_start_label"] = "preferences"
renpy.utter_restart()
class EnsureProjectsTxt(Action):
"""
Ensures the projects.txt file exists before it's opened.
"""
def __call__(self):
fn = os.path.join(project.manager.projects_directory, "projects.txt")
if os.path.exists(fn):
return
with open(fn, "w") as f:
f.write("""\
# This file can be used to add projects not in the projects directory
# by listing the full path to each project, one per line.
""")
default persistent.legacy = False
default persistent.force_new_tutorial = False
default persistent.sponsor_message = True
default persistent.daily_update_check = True
default persistent.daily_update_check_once = False
default persistent.daily_update_check = False
# Keep the default update check from triggering until tomorrow.
default persistent.last_update_check = datetime.date.today()
screen preferences:
# Should we try to skip the splashscreen?
default persistent.skip_splashscreen = False
# Should we prefer rpu updates?
default persistent.prefer_rpu = True
init python:
if not persistent.daily_update_check_once:
persistent.daily_update_check_once = True
persistent.daily_update_check = True
default preference_tab = "general"
define preference_tabs = (
("general", _("General")),
("options", _("Options")),
("theme", _("Theme")),
("install", _("Install Libraries")),
("actions", _("Actions")),
("lint", _("Lint")),
)
screen preferences():
default translations = scan_translations()
$ translations = scan_translations()
frame:
style_group "l"
@@ -127,271 +89,165 @@ screen preferences():
has vbox
# Projects directory selection.
add SEPARATOR2
add HALF_SPACER
for i, l in preference_tabs:
textbutton l action SetVariable("preference_tab", i) style "l_list"
if preference_tab == "general":
frame:
style "l_indent"
xmaximum TWOTHIRDS
yminimum 75
has vbox
text _("Projects Directory:")
add HALF_SPACER
frame style "l_indent":
if persistent.projects_directory:
textbutton _("[persistent.projects_directory!q]"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
else:
textbutton _("Not Set"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
add SPACER
# Text editor selection.
add SEPARATOR2
frame:
style "l_indent"
yminimum 75
has vbox
text _("Text Editor:")
add HALF_SPACER
frame style "l_indent":
if persistent.editor:
textbutton persistent.editor action Jump("editor_preference") alt _("Text editor: [text]")
else:
textbutton _("Not Set") action Jump("editor_preference") alt _("Text editor: [text]")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
yminimum 75
has vbox
text _("Actions:")
add HALF_SPACER
textbutton _("Install libraries") style "l_nonbox" action Jump("install")
textbutton _("Open launcher project") style "l_nonbox" action [ project.Select("launcher"), Jump("front_page") ]
textbutton _("Reset window size") style "l_nonbox" action Preference("display", 1.0)
frame:
style "l_indent"
xmaximum ONETHIRD
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
yminimum 75
has vbox
text _("Navigation Options:")
add HALF_SPACER
textbutton _("Include private names") style "l_checkbox" action ToggleField(persistent, "navigate_private")
textbutton _("Include library names") style "l_checkbox" action ToggleField(persistent, "navigate_library")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
yminimum 75
has vbox
text _("Launcher Options:")
add HALF_SPACER
textbutton _("Show edit file section") style "l_checkbox" action ToggleField(persistent, "show_edit_funcs")
textbutton _("Large fonts") style "l_checkbox" action [ ToggleField(persistent, "large_print"), renpy.utter_restart ]
if renpy.windows:
textbutton _("Console output") style "l_checkbox" action ToggleField(persistent, "windows_console")
if project.manager.get("oldtutorial"):
textbutton _("Force new tutorial") style "l_checkbox" action [ ToggleField(persistent, "force_new_tutorial"), project.SelectTutorial(True) ]
if show_legacy:
textbutton _("Legacy options") style "l_checkbox" action ToggleField(persistent, "legacy")
if persistent.legacy:
textbutton _("Show templates") style "l_checkbox" action ToggleField(persistent, "show_templates")
textbutton _("Sponsor message") style "l_checkbox" action ToggleField(persistent, "sponsor_message")
if ability.can_update:
textbutton _("Daily check for update") style "l_checkbox" action [ToggleField(persistent, "daily_update_check"), SetField(persistent, "last_update_check", None)] selected persistent.daily_update_check
add HALF_SPACER
textbutton _("Default theme") style "l_checkbox" action [SetField(persistent, "theme", None), RestartAtPreferences() ]
# textbutton _("Clear theme") style "l_checkbox" action [SetField(persistent, "theme", "clear", None), RestartAtPreferences() ]
textbutton _("Dark theme") style "l_checkbox" action [SetField(persistent, "theme", "dark", None), RestartAtPreferences()]
textbutton _("Custom theme") style "l_checkbox" action [SetField(persistent, "theme", "custom", None), RestartAtPreferences()]
if translations:
frame:
style "l_indent"
xmaximum ONETHIRD
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Projects Directory:")
add HALF_SPACER
frame style "l_indent":
if persistent.projects_directory:
textbutton _("[persistent.projects_directory!q]"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
else:
textbutton _("Not Set"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
add SPACER
# Text editor selection.
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Text Editor:")
add HALF_SPACER
frame style "l_indent":
textbutton (persistent.editor or _("Not Set")) action Jump("editor_preference") alt _("Text editor: [text]")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
yminimum 75
has vbox
text _("Language:")
add HALF_SPACER
hbox:
for tran in translations:
vbox:
for tlid, tlname in tran:
textbutton tlname:
xmaximum (TWOTHIRDS//3)
action [Language(tlid), project.SelectTutorial(True)]
style "l_list"
viewport:
scrollbars "vertical"
mousewheel True
elif preference_tab == "options":
has vbox
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
# frame style "l_indent":
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Navigation Options:")
add HALF_SPACER
textbutton _("Include private names") style "l_checkbox" action ToggleField(persistent, "navigate_private")
textbutton _("Include library names") style "l_checkbox" action ToggleField(persistent, "navigate_library")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Game Options:")
add HALF_SPACER
if renpy.windows:
textbutton _("Console output") style "l_checkbox" action ToggleField(persistent, "windows_console")
textbutton _("Skip splashscreen") style "l_checkbox" action ToggleField(persistent, "skip_splashscreen")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Launcher Options:")
add HALF_SPACER
textbutton _("Show edit file section") style "l_checkbox" action ToggleField(persistent, "show_edit_funcs")
textbutton _("Large fonts") style "l_checkbox" action [ ToggleField(persistent, "large_print"), renpy.utter_restart ]
if interface.local_doc_exists:
textbutton _("Prefer the web documentation") style "l_checkbox" action ToggleField(persistent, "use_web_doc")
textbutton _("Sponsor message") style "l_checkbox" action ToggleField(persistent, "sponsor_message")
textbutton _("Restore window position") style "l_checkbox" action Preference("restore window position", "toggle")
if ability.can_update:
textbutton _("Daily check for update") style "l_checkbox" action [ToggleField(persistent, "daily_update_check"), SetField(persistent, "last_update_check", None)] selected persistent.daily_update_check
textbutton _("Prefer RPU updates") style "l_checkbox" action ToggleField(persistent, "prefer_rpu")
elif preference_tab == "theme":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Launcher Theme:")
add HALF_SPACER
textbutton _("Default theme") style "l_checkbox" action [SetField(persistent, "theme", None), RestartAtPreferences() ]
textbutton _("Dark theme") style "l_checkbox" action [SetField(persistent, "theme", "dark"), RestartAtPreferences()]
textbutton _("Custom theme") style "l_checkbox" action [SetField(persistent, "theme", "custom"), RestartAtPreferences()]
add SPACER
$ skins_url = interface.get_doc_url("skins.html")
text _("Information about creating a custom theme can be found {a=[skins_url]}in the Ren'Py Documentation{/a}.")
elif preference_tab == "install":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Install Libraries:")
add HALF_SPACER
use install_preferences
elif preference_tab == "actions":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Actions:")
add HALF_SPACER
textbutton _("Open launcher project") style "l_nonbox" action [ project.Select("launcher"), Jump("front_page") ]
textbutton _("Open projects.txt"):
style "l_nonbox"
if project.manager.projects_directory:
action [
EnsureProjectsTxt(),
editor.EditAbsolute(os.path.join(project.manager.projects_directory, "projects.txt"))
]
textbutton _("Reset window size") style "l_nonbox" action Preference("display", 1.0)
textbutton _("Clean temporary files") style "l_nonbox" action Jump("clean_tmp")
elif preference_tab == "lint":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Lint toggles:")
add HALF_SPACER
textbutton _("Check for orphan/obsolete translations"):
style "l_checkbox"
action InvertSelected(ToggleSetMembership(persistent.lint_options, "--no-orphan-tl"))
textbutton _("Check parameters shadowing reserved names"):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--reserved-parameters")
textbutton _("Print block, word, and character counts by speaking character."):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--by-character")
textbutton _("Unclosed text tags"):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--check-unclosed-tags")
textbutton _("Show all unreachable blocks and orphaned translations."):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--all-problems")
for tlname, tlvalue in translations:
textbutton tlname action [ Language(tlvalue), project.SelectTutorial(True) ] style "l_list"
textbutton _("Return") action Jump("front_page") style "l_left_button"
label clean_tmp:
python hide:
installer.processing(_("Cleaning temporary files..."))
installer._clean("renpy:tmp", 0)
time.sleep(0.5)
jump preferences
label projects_directory_preference:
call choose_projects_directory
jump preferences
@@ -400,74 +256,3 @@ label projects_directory_preference:
label preferences:
call screen preferences
jump preferences
screen choose_language():
default local_lang = _preferences.language
default chosen_lang = _preferences.language
default translations = scan_translations(piglatin=False)
add BACKGROUND
vbox:
xalign .5
yalign .5
fixed:
ysize 0
text renpy.translate_string(_("{#in language font}Welcome! Please choose a language"), local_lang):
xalign .5
yanchor 1.0
ypos 1.0
style "l_label_text"
size 36
textalign .5
layout "subtitle"
add SPACER
add SPACER
hbox:
xalign .5
for tran in translations:
vbox:
for tlid, tlname in tran:
textbutton tlname:
xmaximum (TWOTHIRDS//3)
action [ SetScreenVariable("chosen_lang", tlid), Language(tlid), project.SelectTutorial(True), Return() ]
hovered SetScreenVariable("local_lang", tlid)
unhovered SetScreenVariable("local_lang", chosen_lang)
style "l_list"
text_xalign .5
add SPACER
add SPACER
$ lang_name = renpy.translate_string("{#language name and font}", local_lang)
fixed:
ysize 0
textbutton renpy.translate_string(_("{#in language font}Start using Ren'Py in [lang_name]"), local_lang):
xalign .5
action [Language(chosen_lang), project.SelectTutorial(True), Return()]
style "l_default"
text_style "l_default"
text_size 30
text_textalign .5
text_layout "subtitle"
label choose_language:
call screen choose_language
return
translate None strings:
# game/new_project.rpy:77
old "{#language name and font}"
new "English"
+38 -100
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -48,19 +48,18 @@ init python in project:
_("Press shift+O (the letter) to access the console."),
_("Press shift+D to access the developer menu."),
_("Have you backed up your projects recently?"),
_("Lint checks your game for potential mistakes, and gives you statistics."),
]
class Project(object):
def __init__(self, path, name=None):
while path.endswith("/"):
path = path[:-1]
if name is None:
name = os.path.basename(path)
while path.endswith("/"):
path = path[:-1]
if not os.path.exists(path):
raise Exception("{} does not exist.".format(path))
@@ -102,9 +101,9 @@ init python in project:
def load_data(self):
try:
with open(os.path.join(self.path, "project.json"), "r") as f:
with open(os.path.join(self.path, "project.json"), "rb") as f:
self.data = json.load(f)
except Exception:
except:
self.data = { }
self.update_data()
@@ -115,9 +114,9 @@ init python in project:
"""
try:
with open(os.path.join(self.path, "project.json"), "w") as f:
with open(os.path.join(self.path, "project.json"), "wb") as f:
json.dump(self.data, f)
except Exception:
except:
self.load_data()
def update_data(self):
@@ -128,7 +127,6 @@ init python in project:
data.setdefault("add_from", True)
data.setdefault("force_recompile", True)
data.setdefault("android_build", "Release")
data.setdefault("tutorial", False)
if "renamed_all" not in data:
dp = data["packages"]
@@ -169,7 +167,7 @@ init python in project:
try:
os.makedirs(tmp)
except Exception:
except:
pass
if os.path.isdir(tmp):
@@ -188,7 +186,7 @@ init python in project:
self.tmp = tmp
return
except Exception:
except:
pass
self.tmp = tempfile.mkdtemp()
@@ -241,7 +239,7 @@ init python in project:
raise Exception("Python interpreter not found: %r", executables)
# Put together the basic command line.
cmd = [ executable, sys.argv[0] ]
cmd = [ executable, "-EO", sys.argv[0] ]
cmd.append(self.path)
cmd.extend(args)
@@ -260,16 +258,8 @@ init python in project:
environ = dict(os.environ)
environ["RENPY_LAUNCHER_LANGUAGE"] = _preferences.language or "english"
if persistent.skip_splashscreen:
environ["RENPY_SKIP_SPLASHSCREEN"] = "1"
environ.update(env)
# Filter out system PYTHON* environment variables.
if hasattr(sys, "renpy_executable"):
environ = { k : v for k, v in environ.items() if not k.startswith("PYTHON") }
encoded_environ = { }
for k, v in environ.items():
@@ -285,13 +275,7 @@ init python in project:
if wait:
if p.wait():
print("Launch failed. command={!r}, returncode={!r}".format(cmd, p.returncode))
if args and not self.is_writeable():
interface.error(_("Launching the project failed."), _("This may be because the project is not writeable."))
else:
interface.error(_("Launching the project failed."), _("Please ensure that your project launches normally before running this command."))
interface.error(_("Launching the project failed."), _("Please ensure that your project launches normally before running this command."))
renpy.not_infinite_loop(30)
@@ -330,7 +314,7 @@ init python in project:
# add todo list to dump data
self.update_todos()
except Exception:
except:
self.dump["error"] = True
def update_todos(self):
@@ -345,18 +329,17 @@ init python in project:
for f in files:
data = open(self.unelide_filename(f), encoding="utf-8")
data = file(self.unelide_filename(f))
for l, line in enumerate(data):
l += 1
line = line[:1024]
if PY2:
try:
line = line.decode("utf-8")
except Exception:
continue
try:
line = line.decode("utf-8")
except:
continue
m = re.search(r"#\s*TODO(\s*:\s*|\s+)(.*)", line, re.I)
@@ -399,18 +382,9 @@ init python in project:
can be included in the project.
"""
def is_script(fn):
fn = fn.lower()
for i in [ ".rpy", ".rpym", "_ren.py" ]:
if fn.endswith(i):
return True
return False
rv = [ ]
rv.extend(i for i, isdir in util.walk(self.path)
if (not isdir) and is_script(i) and (not i.startswith("tmp/")) )
if (not isdir) and (i.endswith(".rpy") or i.endswith(".rpym")) and (not i.startswith("tmp/")) )
return rv
@@ -421,14 +395,6 @@ init python in project:
return os.path.exists(os.path.join(self.path, fn))
def is_writeable(self):
"""
Returns true if it's possible to write a file in the projects
directory.
"""
return os.access(self.path, os.W_OK)
class ProjectManager(object):
"""
@@ -438,26 +404,26 @@ init python in project:
def __init__(self):
# The projects directory.
self.projects_directory = ""
# The projects directory.
self.projects_directory = ""
# Normal projects, in alphabetical order by lowercase name.
self.projects = [ ]
# Normal projects, in alphabetical order by lowercase name.
self.projects = [ ]
# Template projects.
self.templates = [ ]
# Template projects.
self.templates = [ ]
# All projects - normal, template, and hidden.
self.all_projects = [ ]
# All projects - normal, template, and hidden.
self.all_projects = [ ]
# Directories that have been scanned.
self.scanned = set()
# Directories that have been scanned.
self.scanned = set()
# The tutorial game, and the language it's for.
self.tutoral = None
self.tutorial_language = "the meowing of a cat"
# The tutorial game, and the language it's for.
self.tutoral = None
self.tutorial_language = "the meowing of a cat"
self.scan()
self.scan()
def scan(self):
"""
@@ -488,11 +454,14 @@ init python in project:
if self.projects_directory is not None:
self.scan_directory(self.projects_directory)
self.scan_directory(config.renpy_base)
self.scan_directory(os.path.join(config.renpy_base, "templates"))
self.projects.sort(key=lambda p : p.name.lower())
self.templates.sort(key=lambda p : p.name.lower())
# Select the default project.
if persistent.active_project is not None:
p = self.get(persistent.active_project)
@@ -556,10 +525,6 @@ init python in project:
for path in f:
path = path.strip()
if path.startswith("#"):
continue
if len(path) > 0:
self.scan_directory_direct(path)
@@ -576,7 +541,7 @@ init python in project:
try:
ppath = self.find_basedir(ppath)
except Exception:
except:
return
if ppath is None:
@@ -598,7 +563,6 @@ init python in project:
if project_type == "hidden":
pass
elif project_type == "template":
self.projects.append(p)
self.templates.append(p)
else:
self.projects.append(p)
@@ -772,12 +736,7 @@ init python in project:
blurb = LAUNCH_BLURBS[persistent.blurb % len(LAUNCH_BLURBS)]
persistent.blurb += 1
if persistent.skip_splashscreen:
submessage = _("Splashscreen skipped in launcher preferences.")
else:
submessage = None
interface.interaction(_("Launching"), blurb, submessage=submessage, pause=2.5)
interface.interaction(_("Launching"), blurb, pause=2.5)
def __call__(self):
@@ -861,24 +820,3 @@ init python:
return False
renpy.arguments.register_command("get_projects_directory", get_projects_directory_command)
def set_project_command():
ap = renpy.arguments.ArgumentParser()
ap.add_argument("project", help="The full path to the project to select.")
args = ap.parse_args()
projects = os.path.dirname(os.path.abspath(args.project))
name = os.path.basename(args.project)
persistent.projects_directory = renpy.fsdecode(projects)
project.multipersistent.projects_directory = persistent.projects_directory
persistent.active_project = name
project.multipersistent.save()
renpy.save_persistent()
return False
renpy.arguments.register_command("set_project", set_project_command)
-4
View File
@@ -1,4 +0,0 @@
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmkuXOrZ2viRe4fRCrlqUFGdgRqy9IcWt
5lJvsUqRN619pWZIefz/bau9Sd8vcJt6VKwexOeBmMhzXwZ/1Lm3OQ==
-----END PUBLIC KEY-----
+7 -51
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -19,50 +19,6 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Defaults for custom theme properties.
init -99 python:
# The color of non-interactive text.
custom_text = "#545454"
# Colors for buttons in various states.
custom_idle = "#42637b"
custom_hover = "#d86b45"
custom_disable = "#808080"
# Colors for reversed text buttons (selected list entries).
custom_reverse_idle = "#78a5c5"
reverse_hover = "#d86b45"
custom_reverse_text = "#ffffff"
# Colors for the scrollbar thumb.
custom_scrollbar_idle = "#dfdfdf"
custom_scrollbar_hover = "#d86b45"
# An image used as a separator pattern.
custom_pattern = "images/pattern.png"
# A displayable used for the background of everything.
custom_background = "images/background.png"
# A displayable used for the background of the projects list.
custom_projects_window = Null()
# A displayable used the background of information boxes.
custom_info_window = "#f9f9f9c0"
# Colors for the titles of information boxes.
custom_error_color = "#d15353"
custom_info_color = "#545454"
custom_interaction_color = "#d19753"
custom_question_color = "#d19753"
# The color of input text.
custom_input_color = "#d86b45"
# A displayable used for the background of windows
# containing commands, preferences, and navigation info.
custom_window = Frame(Fixed(Solid(custom_reverse_idle, xsize=4, xalign=0), Solid(custom_info_window, xsize=794, xalign=1.0), xsize=800, ysize=600), 0, 0, tile=True)
init -1:
# Fonts.
@@ -208,7 +164,7 @@ init -1 python:
# containing commands, preferences, and navigation info.
WINDOW = Frame(Fixed(Solid(REVERSE_IDLE, xsize=4, xalign=0), Solid(INFO_WINDOW, xsize=794, xalign=1.0), xsize=800, ysize=600), 0, 0, tile=True)
elif persistent.theme == 'custom':
elif renpy.exists("skin.rpy") and persistent.theme == 'custom':
# The color of non-interactive text.
TEXT = custom_text
@@ -246,7 +202,7 @@ init -1 python:
QUESTION_COLOR = custom_question_color
# The color of input text.
INPUT_COLOR = custom_input_color
INPUT_COLOR = custom_imput_color
# A displayable used for the background of windows
# containing commands, preferences, and navigation info.
@@ -355,8 +311,8 @@ style l_left_button_text is l_right_button_text
style l_root is l_default:
background BACKGROUND
xpadding 10
top_padding 32
bottom_padding 120
top_padding 64
bottom_padding 128
# An inner window.
style l_window is l_default:
@@ -402,7 +358,7 @@ style l_alternate is l_default:
style l_alternate_text is l_default:
size size(14)
font light_font()
textalign 1.0
text_align 1.0
style l_small_button is l_button
@@ -488,7 +444,7 @@ style l_info_button is l_button:
xmargin 50
style l_info_button_text is l_button_text:
textalign 0.5
text_align 0.5
layout "subtitle"
# Progress bar.
+6 -12
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -22,7 +22,6 @@
init python:
class FileTail(object):
def __init__(self, filename, lines=8):
@@ -32,18 +31,13 @@ init python:
def update(self):
def filter_text(s):
if "Unknown chunk type '200'" in s:
return False
return True
try:
with open(self.filename) as f:
text = f.read()
try:
text = renpy.fsdecode(text)
except Exception:
except:
text = text.decode("latin-1")
text = text.strip()
@@ -55,9 +49,6 @@ init python:
if "\r" in l:
_head, _sep, l = l.rpartition("\r")
if not filter_text(l):
continue
while l:
newtext.append(l[:100])
l = l[100:]
@@ -70,5 +61,8 @@ init python:
self.text = text
renpy.restart_interaction()
except Exception:
except:
pass
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+73
View File
@@ -0,0 +1,73 @@
#!/usr/bin/env python
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# This is used on Linux and Mac to prompt the user for the projects
# directory.
import sys
# Gtk generally has better support than TKinter on various Linux distributions
def gtk_select_directory(title):
dialog = Gtk.FileChooserNative(title=title,
action=Gtk.FileChooserAction.SELECT_FOLDER)
dialog.run()
return dialog.get_filename()
# Fall back to TKinter if Gtk isn't available
def tk_select_directory(initialdir, title):
root = Tk()
root.withdraw()
return askdirectory(initialdir=initialdir, parent=root, title=title)
try:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
def select_directory(title):
result = gtk_select_directory(title)
return result if result else ''
except:
# Python3 and Python2-style imports.
try:
from tkinter import Tk
from tkinter.filedialog import askdirectory
except ImportError:
from Tkinter import Tk
from tkFileDialog import askdirectory
def select_directory(title):
return tk_select_directory(title, sys.argv[1])
if __name__ == '__main__':
directory = select_directory('Select Ren\'Py Projects Directory')
sys.stdout.write(directory)
+4 -5
View File
@@ -1,7 +1,5 @@
translate arabic strings:
# game/new_project.rpy:77
old "{#language name and font}"
new "{font=DejaVuSans.ttf}العربية{/font}"
translate arabic strings:
# about.rpy:39
old "[version!q]"
@@ -564,7 +562,7 @@
new "[project_dir!q] يوجد مسبقاً, الرجاء اختيار اسم مختلف."
# gui7.rpy:341
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of [default_size[0]]x[default_size[1]] is a reasonable compromise."
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."
new "ما هو الحجم المطلوب للمشروع؟ رينباي يستطيع تكبير و تصغير حجم النافذة لتناسب الشاشة, لكن الحجم الذي ستختاره هنا هو الحجم القياسي, و الذي ستظهر فيه الصور و الشخصيات في أوضح شكل لها. \n\n الحجم الذي يناسب اغلب الشاشات هو 1280×730 بكسل."
# gui7.rpy:389
@@ -1186,3 +1184,4 @@
# updater.rpy:195
old "Proceed"
new "استمرار"
+5 -4
View File
@@ -174,8 +174,8 @@ translate arabic strings:
new "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
# screens.rpy:418
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# screens.rpy:476
old "Return"
@@ -494,8 +494,8 @@ translate arabic strings:
new "النقر بالزر الأيمن"
# screens.rpy:1062
old "Mouse Wheel Up"
new "تحريك عجلة الفأرة لأعلى"
old "Mouse Wheel Up\nClick Rollback Side"
new "تحريك عجلة الفأرة لأعلى\nClick Rollback Side"
# screens.rpy:1066
old "Mouse Wheel Down"
@@ -640,3 +640,4 @@ translate arabic strings:
# screens.rpy:1429
old "Menu"
new "Menu"
+1 -1
View File
@@ -20,7 +20,7 @@ label start:
define config.rtl = True
define gui.textalign = 1.0
define gui.text_align = 1.0
define gui.button_text_xalign = 1.0
define gui.prompt_text_xalign = 1.0
define gui.navigation_xpos = 240
-978
View File
@@ -1,978 +0,0 @@
translate danish strings:
# renpy/common/00accessibility.rpy:28
old "Self-voicing disabled."
new "Automatisk oplæsning deaktiveret."
# renpy/common/00accessibility.rpy:29
old "Clipboard voicing enabled. "
new "Oplæsning af udklipsholder aktiveret."
# renpy/common/00accessibility.rpy:30
old "Self-voicing enabled. "
new "Automatisk oplæsning aktiveret."
# renpy/common/00accessibility.rpy:32
old "bar"
new "bjælke"
# renpy/common/00accessibility.rpy:33
old "selected"
new "valgt"
# renpy/common/00accessibility.rpy:34
old "viewport"
new "visningsport"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
new "vandret rulning"
# renpy/common/00accessibility.rpy:36
old "vertical scroll"
new "lodret rulning"
# renpy/common/00accessibility.rpy:37
old "activate"
new "aktivér"
# renpy/common/00accessibility.rpy:38
old "deactivate"
new "deaktiver"
# renpy/common/00accessibility.rpy:39
old "increase"
new "øg"
# renpy/common/00accessibility.rpy:40
old "decrease"
new "sænk"
# renpy/common/00accessibility.rpy:138
old "Font Override"
new "Tilsidesættelse af skrifttype"
# renpy/common/00accessibility.rpy:142
old "Default"
new "Standard"
# renpy/common/00accessibility.rpy:146
old "DejaVu Sans"
new "DejaVu Sans"
# renpy/common/00accessibility.rpy:150
old "Opendyslexic"
new "Opendyslexic"
# renpy/common/00accessibility.rpy:156
old "Text Size Scaling"
new "Skalering af skriftstørrelse"
# renpy/common/00accessibility.rpy:162
old "Reset"
new "Nulstil"
# renpy/common/00accessibility.rpy:168
old "Line Spacing Scaling"
new "Skalering af linjeafstand"
# renpy/common/00accessibility.rpy:180
old "High Contrast Text"
new "Tekst med høj kontrast"
# renpy/common/00accessibility.rpy:182
old "Enable"
new "Slå til"
# renpy/common/00accessibility.rpy:186
old "Disable"
new "Slå fra"
# renpy/common/00accessibility.rpy:193
old "Self-Voicing"
new "Automatisk oplæsning"
# renpy/common/00accessibility.rpy:197
old "Off"
new "Fra"
# renpy/common/00accessibility.rpy:201
old "Text-to-speech"
new "Tekst til tale"
# renpy/common/00accessibility.rpy:205
old "Clipboard"
new "Udklipsholder"
# renpy/common/00accessibility.rpy:209
old "Debug"
new "Fejlsøgning"
# renpy/common/00accessibility.rpy:223
old "Self-Voicing Volume Drop"
new "Lydstyrkesænkning ved automatisk oplæsning"
# renpy/common/00accessibility.rpy:234
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
new "Indstillingerne i denne menu er tiltænkt at forbedre tilgængelighed. De virker muligvis ikke med alle spil, og visse kombinationer af indstillinger gør muligvis spillet uspilleligt. Dette er ikke et problem med spillet eller spilmotoren. Prøv at bevare den originale skriftstørrelse for at opnå det bedste resultat væd ændring af skrifttype."
# renpy/common/00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}mandag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}tirsdag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}onsdag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}torsdag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}fredag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}lørdag"
# renpy/common/00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}søndag"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}man"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}tir"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}ons"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}tor"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}fre"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}lør"
# renpy/common/00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}søn"
# renpy/common/00action_file.rpy:47
old "{#month}January"
new "{#month}januar"
# renpy/common/00action_file.rpy:47
old "{#month}February"
new "{#month}februar"
# renpy/common/00action_file.rpy:47
old "{#month}March"
new "{#month}marts"
# renpy/common/00action_file.rpy:47
old "{#month}April"
new "{#month}april"
# renpy/common/00action_file.rpy:47
old "{#month}May"
new "{#month}maj"
# renpy/common/00action_file.rpy:47
old "{#month}June"
new "{#month}juni"
# renpy/common/00action_file.rpy:47
old "{#month}July"
new "{#month}juli"
# renpy/common/00action_file.rpy:47
old "{#month}August"
new "{#month}august"
# renpy/common/00action_file.rpy:47
old "{#month}September"
new "{#month}september"
# renpy/common/00action_file.rpy:47
old "{#month}October"
new "{#month}oktober"
# renpy/common/00action_file.rpy:47
old "{#month}November"
new "{#month}november"
# renpy/common/00action_file.rpy:47
old "{#month}December"
new "{#month}december"
# renpy/common/00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}jan"
# renpy/common/00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}feb"
# renpy/common/00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}mar"
# renpy/common/00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}apr"
# renpy/common/00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}maj"
# renpy/common/00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}jun"
# renpy/common/00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}jul"
# renpy/common/00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}aug"
# renpy/common/00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}sep"
# renpy/common/00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}okt"
# renpy/common/00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}nov"
# renpy/common/00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}dec"
# renpy/common/00action_file.rpy:258
old "%b %d, %H:%M"
new "%d. %b, %H:%M"
# renpy/common/00action_file.rpy:378
old "Save slot %s: [text]"
new "Gem plads %s: [text]"
# renpy/common/00action_file.rpy:461
old "Load slot %s: [text]"
new "Indlæs plads %s: [text]"
# renpy/common/00action_file.rpy:514
old "Delete slot [text]"
new "Slet plads [text]"
# renpy/common/00action_file.rpy:593
old "File page auto"
new "Filside auto"
# renpy/common/00action_file.rpy:595
old "File page quick"
new "Filside hurtig"
# renpy/common/00action_file.rpy:597
old "File page [text]"
new "Filside [text]"
# renpy/common/00action_file.rpy:796
old "Next file page."
new "Næste filside."
# renpy/common/00action_file.rpy:868
old "Previous file page."
new "Forrige filside."
# renpy/common/00action_file.rpy:929
old "Quick save complete."
new "Hurtiggemning fuldført."
# renpy/common/00action_file.rpy:944
old "Quick save."
new "Hurtiggem."
# renpy/common/00action_file.rpy:963
old "Quick load."
new "Hurtigindlæs."
# renpy/common/00action_other.rpy:383
old "Language [text]"
new "Sprog [text]"
# renpy/common/00action_other.rpy:724
old "Open [text] directory."
new "Åbn mappen [text]."
# renpy/common/00director.rpy:705
old "The interactive director is not enabled here."
new "Det interaktive instruktionsværktøj er ikke aktiveret her."
# renpy/common/00director.rpy:1504
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1510
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1574
old "Done"
new "Færdig"
# renpy/common/00director.rpy:1584
old "(statement)"
new "(sætning)"
# renpy/common/00director.rpy:1585
old "(tag)"
new "(mærke)"
# renpy/common/00director.rpy:1586
old "(attributes)"
new "(attributter)"
# renpy/common/00director.rpy:1587
old "(transform)"
new "(transformation)"
# renpy/common/00director.rpy:1612
old "(transition)"
new "(overgang)"
# renpy/common/00director.rpy:1624
old "(channel)"
new "(kanal)"
# renpy/common/00director.rpy:1625
old "(filename)"
new "(filnavn)"
# renpy/common/00director.rpy:1654
old "Change"
new "Ændr"
# renpy/common/00director.rpy:1656
old "Add"
new "Tilføj"
# renpy/common/00director.rpy:1659
old "Cancel"
new "Annuller"
# renpy/common/00director.rpy:1662
old "Remove"
new "Fjern"
# renpy/common/00director.rpy:1697
old "Statement:"
new "Sætning:"
# renpy/common/00director.rpy:1718
old "Tag:"
new "Mærke:"
# renpy/common/00director.rpy:1734
old "Attributes:"
new "Attributter:"
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
new "Klik for at slå attributter til/fra, højreklik for at slå negative attributter til/fra."
# renpy/common/00director.rpy:1757
old "Transforms:"
new "Transformationer:"
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
new "Klik for at stille transformation, højreklik for at tilføje til transformationsliste."
# renpy/common/00director.rpy:1780
old "Behind:"
new "Bagved:"
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
new "Klik for at stille, højreklik for at tilføje til bagvedliste."
# renpy/common/00director.rpy:1801
old "Transition:"
new "Overgang:"
# renpy/common/00director.rpy:1819
old "Channel:"
new "Kanal:"
# renpy/common/00director.rpy:1837
old "Audio Filename:"
new "Lydfilnavn:"
# renpy/common/00gui.rpy:446
old "Are you sure?"
new "Er du sikker?"
# renpy/common/00gui.rpy:447
old "Are you sure you want to delete this save?"
new "Vil du gerne slette denne gemmefil?"
# renpy/common/00gui.rpy:448
old "Are you sure you want to overwrite your save?"
new "Vil du gerne overskrive din gemmefil?"
# renpy/common/00gui.rpy:449
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Ved indlæsning vil ugemte fremskridt gå tabt.\nVil du gerne gøre dette?"
# renpy/common/00gui.rpy:450
old "Are you sure you want to quit?"
new "Vil du gerne afslutte?"
# renpy/common/00gui.rpy:451
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Vil du gerne vende tilbage til hovedmenuen?\nUgemte fremskridt vil gå tabt."
# renpy/common/00gui.rpy:452
old "Are you sure you want to end the replay?"
new "Vil du gerne afslutte genafspilningnen?"
# renpy/common/00gui.rpy:453
old "Are you sure you want to begin skipping?"
new "Vil du gerne påbegynde overspringning?"
# renpy/common/00gui.rpy:454
old "Are you sure you want to skip to the next choice?"
new "Vil du gerne springe videre til det næste valg?"
# renpy/common/00gui.rpy:455
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Vil du gerne springe over uset dialog til det næste valg?"
# renpy/common/00gui.rpy:456
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
new "Denne gemmefil blev oprettet på en anden enhed. Gemmefiler konstrueret med ondsindet hensigt kan skade din computer. Stoler du på den, der har oprettet gemmefilen, og på alle, der kan have ændret filen?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
new "Stoler du på enheden, som gemmefilen oprettedes på? Du bør kun vælge ja, hvis du er enhedens eneste bruger."
# renpy/common/00keymap.rpy:322
old "Failed to save screenshot as %s."
new "Kunne ikke gemme skærmbillede som %s."
# renpy/common/00keymap.rpy:334
old "Saved screenshot as %s."
new "Gemte skærmbillede som %s."
# renpy/common/00library.rpy:248
old "Skip Mode"
new "Overspringstilstand"
# renpy/common/00library.rpy:335
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
new "Dette program indeholder gratis software under forskellige licenser, herunder MIT-licensen og GNU Lesser General Public License. En komplet liste over software, inklusiv links til fulde kildekoder, kan findes {a=https://www.renpy.org/l/license}her{/a}."
# renpy/common/00preferences.rpy:271
old "display"
new "skærmvisning"
# renpy/common/00preferences.rpy:287
old "transitions"
new "overgange"
# renpy/common/00preferences.rpy:296
old "skip transitions"
new "spring overgange over"
# renpy/common/00preferences.rpy:298
old "video sprites"
new "videosprites"
# renpy/common/00preferences.rpy:307
old "show empty window"
new "vis tomt vindue"
# renpy/common/00preferences.rpy:316
old "text speed"
new "teksthastighed"
# renpy/common/00preferences.rpy:324
old "joystick"
new "styrepind"
# renpy/common/00preferences.rpy:324
old "joystick..."
new "styrepind..."
# renpy/common/00preferences.rpy:331
old "skip"
new "spring over"
# renpy/common/00preferences.rpy:334
old "skip unseen [text]"
new "spring over uset [text]"
# renpy/common/00preferences.rpy:339
old "skip unseen text"
new "spring over uset tekst"
# renpy/common/00preferences.rpy:341
old "begin skipping"
new "påbegynd overspringning"
# renpy/common/00preferences.rpy:345
old "after choices"
new "efter valg"
# renpy/common/00preferences.rpy:352
old "skip after choices"
new "spring over efter valg"
# renpy/common/00preferences.rpy:354
old "auto-forward time"
new "auto-fremad-tid"
# renpy/common/00preferences.rpy:368
old "auto-forward"
new "auto-fremad"
# renpy/common/00preferences.rpy:375
old "Auto forward"
new "auto-fremad"
# renpy/common/00preferences.rpy:378
old "auto-forward after click"
new "auto-fremad efter klik"
# renpy/common/00preferences.rpy:387
old "automatic move"
new "automatisk bevægelse"
# renpy/common/00preferences.rpy:396
old "wait for voice"
new "vent på stemme"
# renpy/common/00preferences.rpy:405
old "voice sustain"
new "stemmebevarelse"
# renpy/common/00preferences.rpy:414
old "self voicing"
new "automatisk oplæsning"
# renpy/common/00preferences.rpy:423
old "self voicing volume drop"
new "lydstyrkesænkning ved automatisk oplæsning"
# renpy/common/00preferences.rpy:431
old "clipboard voicing"
new "oplæsning af udklipsholder"
# renpy/common/00preferences.rpy:440
old "debug voicing"
new "oplæsning af fejlsøgning"
# renpy/common/00preferences.rpy:449
old "emphasize audio"
new "fremhæv lyd"
# renpy/common/00preferences.rpy:458
old "rollback side"
new "tilbagerulningsside"
# renpy/common/00preferences.rpy:468
old "gl powersave"
new "gl-strømbesparelse"
# renpy/common/00preferences.rpy:474
old "gl framerate"
new "gl-billedhastighed"
# renpy/common/00preferences.rpy:477
old "gl tearing"
new "gl-overrivning"
# renpy/common/00preferences.rpy:480
old "font transform"
new "skrifttransformation"
# renpy/common/00preferences.rpy:483
old "font size"
new "skriftstørrelse"
# renpy/common/00preferences.rpy:491
old "font line spacing"
new "linjeafstand for skrift"
# renpy/common/00preferences.rpy:499
old "system cursor"
new "systemmarkør"
# renpy/common/00preferences.rpy:508
old "renderer menu"
new "optegningsmenu"
# renpy/common/00preferences.rpy:511
old "accessibility menu"
new "tilgængelighedsmenu"
# renpy/common/00preferences.rpy:514
old "high contrast text"
new "tekst med høj kontrast"
# renpy/common/00preferences.rpy:523
old "audio when minimized"
new "lyd ved minimeret tilstand"
# renpy/common/00preferences.rpy:532
old "audio when unfocused"
new "lyd ved ufokuseret tilstand"
# renpy/common/00preferences.rpy:541
old "web cache preload"
new "forudindlæsning af webcache"
# renpy/common/00preferences.rpy:556
old "voice after game menu"
new "stemme efter spilmenu"
# renpy/common/00preferences.rpy:575
old "main volume"
new "primær lydstyrke"
# renpy/common/00preferences.rpy:576
old "music volume"
new "musiklydstyrke"
# renpy/common/00preferences.rpy:577
old "sound volume"
new "lydeffektlydstyrke"
# renpy/common/00preferences.rpy:578
old "voice volume"
new "stemmelydstyrke"
# renpy/common/00preferences.rpy:579
old "mute main"
new "slå primær lyd fra"
# renpy/common/00preferences.rpy:580
old "mute music"
new "slå musik fra"
# renpy/common/00preferences.rpy:581
old "mute sound"
new "slå lydeffekter fra"
# renpy/common/00preferences.rpy:582
old "mute voice"
new "slå stemmer fra"
# renpy/common/00preferences.rpy:583
old "mute all"
new "slå alle fra"
# renpy/common/00preferences.rpy:657
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Oplæsning af udklipsholder aktiveret. Tryk på 'shift+C' for at deaktivere."
# renpy/common/00preferences.rpy:659
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Automatisk oplæsning ville sige \"[renpy.display.tts.last]\". Tryk på 'alt+shift+V' for at deaktivere."
# renpy/common/00preferences.rpy:661
old "Self-voicing enabled. Press 'v' to disable."
new "Automatisk oplæsning aktiveret. Tryk på 'v' for at deaktivere."
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
new "Talebobleredigering"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
new "(skjul)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
new "Synkronisering hentet."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
new "Kunne ikke oprette forbindelse til Ren'Py Sync-serveren."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
new "Der opstod et forbindelsestimeout til Ren'Py Sync-serveren."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
new "En ukendt fejl opstod under forbindelse til Ren'Py Sync-serveren."
# renpy/common/00sync.rpy:267
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
new "Ren'Py Sync-serveren har ikke en kopi af denne synkronisering. Synkroniserings-id'er er muligvis ugyldig eller udløbet."
# renpy/common/00sync.rpy:412
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
new "Indtast venligst dit genererede synkroniserings-id.\nIndtast aldrig et synkroniserings-id, som du ikke selv har oprettet."
# renpy/common/00sync.rpy:431
old "The sync ID is not in the correct format."
new "Synkroniserings-id'et er ikke i det korrekte format."
# renpy/common/00sync.rpy:451
old "The sync could not be decrypted."
new "Synkroniseringen kunne ikke afkodes."
# renpy/common/00sync.rpy:474
old "The sync belongs to a different game."
new "Synkroniseringen tilhører et andet spil."
# renpy/common/00sync.rpy:479
old "The sync contains a file with an invalid name."
new "Synkroniseringen indeholder en fil med et ugyldigt navn."
# renpy/common/00sync.rpy:532
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
new "Dette sender dine gemmefiler til {a=https://sync.renpy.org}Ren'Py Sync-serveren{/a}.\nVil du gerne fortsætte?"
# renpy/common/00sync.rpy:561
old "Enter Sync ID"
new "Indtast Synkroniserings-id"
# renpy/common/00sync.rpy:572
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
new "Dette kontakter {a=https://sync.renpy.org}Ren'Py Sync-serveren{/a}."
# renpy/common/00sync.rpy:599
old "Sync Success"
new "Synkronisering lykkedes"
# renpy/common/00sync.rpy:602
old "The Sync ID is:"
new "Synkroniserings-id'et er:"
# renpy/common/00sync.rpy:608
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
new "Du kan bruge dette id til at hente din gemmefil på en anden enhed.\nDenne synkronisering udløber om en time.\nRen'Py Sync støttes af {a=https://www.renpy.org/sponsors.html}Ren'Pys sponsorer{/a}."
# renpy/common/00sync.rpy:612
old "Continue"
new "Fortsæt"
# renpy/common/00sync.rpy:634
old "Sync Error"
new "Synkroniseringsfejl"
# renpy/common/00iap.rpy:219
old "Contacting App Store\nPlease Wait..."
new "Kontakter App Store\nVent venligst..."
# renpy/common/00updater.rpy:419
old "The Ren'Py Updater is not supported on mobile devices."
new "Ren'Py-opdateringsprogrammet understøttes ikke på mobilenheder."
# renpy/common/00updater.rpy:548
old "An error is being simulated."
new "En fejl simuleres."
# renpy/common/00updater.rpy:738
old "Either this project does not support updating, or the update status file was deleted."
new "Enten understøtter dette projekt ikke opdatering, eller også er opdateringsstatusfilen blevet slettet."
# renpy/common/00updater.rpy:752
old "This account does not have permission to perform an update."
new "Denne bruger har ikke tilladelse til at udføre en opdatering."
# renpy/common/00updater.rpy:755
old "This account does not have permission to write the update log."
new "Denne bruger har ikke tilladelse til at skrive opdateringsloggen."
# renpy/common/00updater.rpy:783
old "Could not verify update signature."
new "Kunne ikke efterprøve opdateringssignaturen."
# renpy/common/00updater.rpy:1084
old "The update file was not downloaded."
new "Opdateringsfilen blev ikke hentet."
# renpy/common/00updater.rpy:1102
old "The update file does not have the correct digest - it may have been corrupted."
new "Opdateringsfilen har ikke det korrekte fingeraftryk - den er muligvis blevet korrupteret."
# renpy/common/00updater.rpy:1252
old "While unpacking {}, unknown type {}."
new "Under udpakning {}, ukendt type {}"
# renpy/common/00updater.rpy:1624
old "Updater"
new "Opdateringsprogram"
# renpy/common/00updater.rpy:1635
old "This program is up to date."
new "Dette program er ajour."
# renpy/common/00updater.rpy:1637
old "[u.version] is available. Do you want to install it?"
new "[u.version] er tilgængelig. Vil du gerne installere denne?"
# renpy/common/00updater.rpy:1639
old "Preparing to download the updates."
new "Forbereder hentning af opdateringerne."
# renpy/common/00updater.rpy:1641
old "Downloading the updates."
new "Henter opdateringerne."
# renpy/common/00updater.rpy:1643
old "Unpacking the updates."
new "Udpakker opdateringerne."
# renpy/common/00updater.rpy:1647
old "The updates have been installed. The program will restart."
new "Opdateringer er blevet installeret. Programmet genstarter."
# renpy/common/00updater.rpy:1649
old "The updates have been installed."
new "Opdateringerne er blevet installeret."
# renpy/common/00updater.rpy:1651
old "The updates were cancelled."
new "Opdateringerne blev annulleret."
# renpy/common/00gallery.rpy:627
old "Image [index] of [count] locked."
new "Billede [index] af [count] låst."
# renpy/common/00gallery.rpy:647
old "prev"
new "forrige"
# renpy/common/00gallery.rpy:648
old "next"
new "næste"
# renpy/common/00gallery.rpy:649
old "slideshow"
new "diasshow"
# renpy/common/00gallery.rpy:650
old "return"
new "tilbage"
# renpy/common/00director.rpy:1776
old "Customize director.transforms to add more transforms."
new "Tilpas director.transforms for at tilføje flere transformationer."
# renpy/common/00director.rpy:1821
old "Click to set."
new "Klik for at stille."
# renpy/common/00director.rpy:1822
old "Customize director.transitions to add more transitions."
new "Tilpas director.transitions for at tilføje flere overgange."
# renpy/common/00director.rpy:1845
old "Customize director.audio_channels to add more channels."
new "Tilpas director.audio_channels for at tilføje flere kanaler."
# renpy/common/00preferences.rpy:573
old "restore window position"
new "gendan vinduesplacering"
# renpy/common/00speechbubble.rpy:408
old "(clear retained bubbles)"
new "(opryd bibeholdte bobler)"
# renpy/common/00updater.rpy:504
old "No update methods found."
new "Ingen opdateringsmetoder fundet."
# renpy/common/00updater.rpy:551
old "Could not download file list: "
new "Kunne ikke hente filliste:"
# renpy/common/00updater.rpy:554
old "File list digest does not match."
new "Fillistens fingeraftryk matcher ikke."
# renpy/common/00updater.rpy:2072
old "Preparing to download the game data."
new "Forbereder hentning af spildataene."
# renpy/common/00updater.rpy:2074
old "Downloading the game data."
new "Henter spildataene."
# renpy/common/00updater.rpy:2076
old "The game data has been downloaded."
new "Spildataene er blevet hentet."
# renpy/common/00updater.rpy:2078
old "An error occured when trying to download game data:"
new "En fejl opstod under forsøg på hentning af spildata:"
# renpy/common/00updater.rpy:2083
old "This game cannot be run until the game data has been downloaded."
new "Dette spil kan ikke køres, indtil spildataene er blevet hentet."
# renpy/common/00updater.rpy:2090
old "Retry"
new "Prøv igen"
# renpy/common/00accessibility.rpy:120
old "Accessibility Menu. Use up and down arrows to navigate, and enter to activate buttons and bars."
new "Tilgængelighedsmenu. Brug op- og ned-piletasterne til at navigere og retur til at aktivere knapper og bjælker."
# renpy/common/00gui.rpy:454
old "Are you sure you want to continue where you left off?"
new "Vil du gerne fortsætte fra hvor du slap?"
# renpy/common/00preferences.rpy:439
old "self voicing enable"
new "aktivér automatisk oplæsning"
# renpy/common/00preferences.rpy:441
old "self voicing disable"
new "deaktiver automatisk oplæsning"
# renpy/common/00preferences.rpy:456
old "clipboard voicing enable"
new "aktivér oplæsning af udklipsholder"
# renpy/common/00preferences.rpy:458
old "clipboard voicing disable"
new "deaktiver oplæsning af udklipsholder"
# renpy/common/00preferences.rpy:465
old "debug voicing enable"
new "aktivér oplæsning af fejlsøgning"
# renpy/common/00preferences.rpy:467
old "debug voicing disable"
new "deaktiver oplæsning af fejlsøgning"
# renpy/common/00preferences.rpy:596
old "reset"
new "nulstil"
-278
View File
@@ -1,278 +0,0 @@
translate danish strings:
# renpy/common/_developer/developer.rpym:38
old "Developer Menu"
new "Udviklermenu"
# renpy/common/_developer/developer.rpym:43
old "Interactive Director (D)"
new "Interaktivt instruktionsværktøj (D)"
# renpy/common/_developer/developer.rpym:45
old "Reload Game (Shift+R)"
new "Genindlæs spil (Shift+R)"
# renpy/common/_developer/developer.rpym:47
old "Console (Shift+O)"
new "Konsol (Shift+O)"
# renpy/common/_developer/developer.rpym:49
old "Variable Viewer"
new "Variabelviser"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "Vedvarende data-viser"
# renpy/common/_developer/developer.rpym:53
old "Image Location Picker"
new "Billedplaceringsvælger"
# renpy/common/_developer/developer.rpym:55
old "Filename List"
new "Filnavneliste"
# renpy/common/_developer/developer.rpym:59
old "Show Image Load Log (F4)"
new "Vis billedindlæsningslog (F4)"
# renpy/common/_developer/developer.rpym:62
old "Hide Image Load Log (F4)"
new "Skjul billedindlæsningslog (F4)"
# renpy/common/_developer/developer.rpym:65
old "Image Attributes"
new "Billedattributter"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Talebobleredigering (Shift+B)"
# renpy/common/_developer/developer.rpym:97
old "[name] [attributes] (hidden)"
new "[name] [attributes] (skjult)"
# renpy/common/_developer/developer.rpym:101
old "[name] [attributes]"
new "[name] [attributes]"
# renpy/common/_developer/developer.rpym:151
old "Nothing to inspect."
new "Intet at inspicere."
# renpy/common/_developer/developer.rpym:162
old "Hide deleted"
new "Skjul slettede"
# renpy/common/_developer/developer.rpym:162
old "Show deleted"
new "Vis slettede"
# renpy/common/_developer/developer.rpym:318
old "Rectangle copied to clipboard."
new "Rektangel kopieret til udklipsholder."
# renpy/common/_developer/developer.rpym:321
old "Position copied to clipboard."
new "Position kopieret til udklipsholder."
# renpy/common/_developer/developer.rpym:333
old "Rectangle: %r"
new "Rektangel: %r"
# renpy/common/_developer/developer.rpym:336
old "Mouse position: %r"
new "Museposition: %r"
# renpy/common/_developer/developer.rpym:341
old "Right-click or escape to quit."
new "Højreklik eller escape for at afslutte."
# renpy/common/_developer/developer.rpym:389
old "Type to filter: "
new "Skriv for at filtrere: "
# renpy/common/_developer/developer.rpym:507
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Teksturer: [tex_count] ([tex_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:511
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Billedcache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:521
old "✔ "
new "✔ "
# renpy/common/_developer/developer.rpym:524
old "✘ "
new "✘ "
# renpy/common/_developer/developer.rpym:529
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
new "\n{color=#cfc}✔ forudset billede (godt){/color}\n{color=#fcc}✘ uforudset billede (dårligt){/color}\n{color=#fff}Træk for at flytte.{/color}"
# renpy/common/_developer/inspector.rpym:38
old "Displayable Inspector"
new "Inspektion af visbare elementer"
# renpy/common/_developer/inspector.rpym:61
old "Size"
new "Størrelse"
# renpy/common/_developer/inspector.rpym:65
old "Style"
new "Stil"
# renpy/common/_developer/inspector.rpym:71
old "Location"
new "Placering"
# renpy/common/_developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "Inspicerer stile for [displayable_name!q]"
# renpy/common/_developer/inspector.rpym:139
old "displayable:"
new "visbart element:"
# renpy/common/_developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (ingen egenskaber påvirker det visbare element)"
# renpy/common/_developer/inspector.rpym:147
old " (default properties omitted)"
new " (standardegenskaber udeladt)"
# renpy/common/_developer/inspector.rpym:185
old "<repr() failed>"
new "<repr() mislykkedes>"
# renpy/common/00console.rpy:537
old "Press <esc> to exit console. Type help for help.\n"
new "Tryk <esc> for at gå ud af konsol. Skriv help for hjælp.\n"
# renpy/common/00console.rpy:541
old "Ren'Py script enabled."
new "Ren'Py-script aktiveret" #manuskripterne eller scripting?
# renpy/common/00console.rpy:543
old "Ren'Py script disabled."
new "Ren'Py-script deaktiveret." #manuskripterne eller scripting?
# renpy/common/00console.rpy:793
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
new "help: vis denne hjælp\n help <udtryk>: vis signaturen og dokumentationen for <udtryk>"
# renpy/common/00console.rpy:817
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
new "Hjælp viser muligvis udokumenterede funktioner. Tjek venligst, om den funktion\neller klasse, du gerne vil bruge, er dokumenteret.\n\n"
# renpy/common/00console.rpy:826
old "commands:\n"
new "kommandoer:\n"
# renpy/common/00console.rpy:836
old " <renpy script statement>: run the statement\n"
new " <renpy-script-ordre>: kør ordren\n"
# renpy/common/00console.rpy:838
old " <python expression or statement>: run the expression or statement"
new " <python-udtryk eller -ordre>: kør udtrykket eller ordren"
# renpy/common/00console.rpy:846
old "clear: clear the console history"
new "clear: ryd konsolhistorikken"
# renpy/common/00console.rpy:850
old "exit: exit the console"
new "exit: gå ud af konsollen"
# renpy/common/00console.rpy:858
old "stack: print the return stack"
new "stack: udskriv returstakken"
# renpy/common/00console.rpy:880
old "load <slot>: loads the game from slot"
new "load <plads>: indlæser spillet fra plads"
# renpy/common/00console.rpy:893
old "save <slot>: saves the game in slot"
new "save <plads>: gemmer spillet på plads"
# renpy/common/00console.rpy:904
old "reload: reloads the game, refreshing the scripts"
new "reload: genindlæser spiller og genopfrisker manuskripterne"
# renpy/common/00console.rpy:912
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
new "watch <udtryk>: hold øje med et python-udtryk\n watch short: gør repræsentationen af sporede udtryk kort (standard)\n watch long: gør repræsentationen af sporede udtryk, som den er"
# renpy/common/00console.rpy:949
old "unwatch <expression>: stop watching an expression"
new "unwatch <udtryk>: stop med at holde øje med et udtryk"
# renpy/common/00console.rpy:995
old "unwatchall: stop watching all expressions"
new "unwatchall: stop med at holde øje med alle udtryk"
# renpy/common/00console.rpy:1016
old "jump <label>: jumps to label"
new "jump <label>: springer til mærkat"
# renpy/common/00console.rpy:1032
old "short: Shorten the representation of objects on the console (default)."
new "short: Forkort repræsentationen af objekter i konsollen (standard)."
# renpy/common/00console.rpy:1036
old "long: Print the full representation of objects on the console."
new "long: Skriv den fulde repræsentationen af objekter til konsollen."
# renpy/common/00console.rpy:1040
old "escape: Enables escaping of unicode symbols in unicode strings."
new "escape: Aktiverer omdannelsen af unicode-tegn til undvigesekvenser i unicode-strenge."
# renpy/common/00console.rpy:1044
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
new "unescape: Deaktiverer omdannelsen af unicode-tegn til undvigesekvenser i unicode-strenge og skriver dem, som de er (standard)."
# renpy/common/_developer/developer.rpym:69
old "Show Translation Identifiers"
new "Vis oversættelsesidentifikatorer"
# renpy/common/_developer/developer.rpym:72
old "Hide Translation Identifiers"
new "Skjul oversættelsesidentifikatorer"
# renpy/common/_developer/developer.rpym:81
old "Show Filename and Line"
new "Vil filnavn og linje"
# renpy/common/_developer/developer.rpym:84
old "Hide Filename and Line"
new "Skjul filnavn og linje"
# renpy/common/_developer/developer.rpym:127
old "Layer [l]:"
new "Lag [l]:"
# renpy/common/_developer/developer.rpym:131
old " [name] [attributes] (hidden)"
new " [name] [attributes] (skjult)"
# renpy/common/_developer/developer.rpym:135
old " [name] [attributes]"
new " [name] [attributes]"
# renpy/common/_developer/developer.rpym:606
old "\n{color=#fff}Copied to clipboard.{/color}"
new "\n{color=#fff}Kopieret til udklipsholder.{/color}"
# renpy/common/_developer/developer.rpym:612
old "\n{color=#fff}Click to copy.\nDrag to move.{/color}"
new "\n{color=#fff}Klik for at kopiere.\nTræk for at flytte.{/color}"
# renpy/common/_developer/developer.rpym:657
old "Click to open in editor."
new "Klik for at åbne i tekstbehandler."
-202
View File
@@ -1,202 +0,0 @@
translate danish strings:
# renpy/common/00gltest.rpy:89
old "Renderer"
new "Optegner"
# renpy/common/00gltest.rpy:93
old "Automatically Choose"
new "Vælg automatisk"
# renpy/common/00gltest.rpy:100
old "Force GL Renderer"
new "Påtving GL-optegner"
# renpy/common/00gltest.rpy:105
old "Force ANGLE Renderer"
new "Påtving ANGLE-optegner"
# renpy/common/00gltest.rpy:110
old "Force GLES Renderer"
new "Påtving GLES-optegner"
# renpy/common/00gltest.rpy:116
old "Force GL2 Renderer"
new "Påtving GL2-optegner"
# renpy/common/00gltest.rpy:121
old "Force ANGLE2 Renderer"
new "Påtving ANGLE2-optegner"
# renpy/common/00gltest.rpy:126
old "Force GLES2 Renderer"
new "Påtving GLES2-optegner"
# renpy/common/00gltest.rpy:136
old "Enable (No Blocklist)"
new "Aktivér (ingen blocklist)"
# renpy/common/00gltest.rpy:159
old "Powersave"
new "Strømsparing"
# renpy/common/00gltest.rpy:173
old "Framerate"
new "Billedhastighed"
# renpy/common/00gltest.rpy:177
old "Screen"
new "Skærm"
# renpy/common/00gltest.rpy:181
old "60"
new "60"
# renpy/common/00gltest.rpy:185
old "30"
new "30"
# renpy/common/00gltest.rpy:191
old "Tearing"
new "Tearing (overrivning)"
# renpy/common/00gltest.rpy:207
old "Changes will take effect the next time this program is run."
new "Ændringer træder i kraft, næste gang dette program køres."
# renpy/common/00gltest.rpy:242
old "Performance Warning"
new "Ydeevneadvarsel"
# renpy/common/00gltest.rpy:247
old "This computer is using software rendering."
new "Denne computer bruger softwareoptegning."
# renpy/common/00gltest.rpy:249
old "This game requires use of GL2 that can't be initialised."
new "Dette spil kræver brugen af GL2, som ikke kan initialiseres."
# renpy/common/00gltest.rpy:251
old "This computer has a problem displaying graphics: [problem]."
new "Denne computer har et problem med visning af grafik: [problem]."
# renpy/common/00gltest.rpy:255
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "Dens grafikdrivere er muligvis forældede eller fungerer ikke korrekt. Dette kan føre til langsom eller ukorrkekt grafikvisning."
# renpy/common/00gltest.rpy:259
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
new "Filen {a=edit:1:log.txt}log.txt{/a} indeholder muligvis information, der kan hjælpe dig med at bestemme, hvad der er galt med din computer."
# renpy/common/00gltest.rpy:264
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
new "Flere detaljer om, hvordan du fikser dette, kan findes i {a=[url]}dokumentationen{/a}."
# renpy/common/00gltest.rpy:269
old "Continue, Show this warning again"
new "Fortsæt, og vis denne advarsel igen"
# renpy/common/00gltest.rpy:273
old "Continue, Don't show warning again"
new "Fortsæt, og vis ikke advarsel igen"
# renpy/common/00gltest.rpy:281
old "Change render options"
new "Ændr optegningsindstillinger"
# renpy/common/00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Vælg spillekontrol at kalibrere"
# renpy/common/00gamepad.rpy:35
old "No Gamepads Available"
new "Ingen spillekontroller tilgængelige"
# renpy/common/00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Kalibrerer [name] ([i]/[total])"
# renpy/common/00gamepad.rpy:58
old "Press or move the '[control!s]' [kind]."
new "Tryk eller bevæg '[control!s]' [kind]."
# renpy/common/00gamepad.rpy:68
old "Skip (A)"
new "Spring over (A)"
# renpy/common/00gamepad.rpy:71
old "Back (B)"
new "Tilbage (B)"
# renpy/common/_errorhandling.rpym:555
old "Open"
new "Åbn"
# renpy/common/_errorhandling.rpym:557
old "Opens the traceback.txt file in a text editor."
new "Åbner traceback.txt-filen i en tekstbehandler."
# renpy/common/_errorhandling.rpym:559
old "Copy BBCode"
new "Kopiér BBCode"
# renpy/common/_errorhandling.rpym:561
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
new "Kopierer traceback.txt-filen til udkplipsholderen som BBCode til forummer som https://lemmasoft.renai.us/."
# renpy/common/_errorhandling.rpym:563
old "Copy Markdown"
new "Kopiér Markdown"
# renpy/common/_errorhandling.rpym:565
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
new "Kopierer traceback.txt-filen til udkplipsholderen som Markdown til Discord."
# renpy/common/_errorhandling.rpym:594
old "An exception has occurred."
new "En undtagelse er opstået."
# renpy/common/_errorhandling.rpym:617
old "Rollback"
new "Tilbagerulning"
# renpy/common/_errorhandling.rpym:619
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Forsøger en tilbagerulning til et forrigt tidspunkt og gør det muligt for dig at gemme eller træffe et andet valg."
# renpy/common/_errorhandling.rpym:622
old "Ignore"
new "Ignorer"
# renpy/common/_errorhandling.rpym:626
old "Ignores the exception, allowing you to continue."
new "Ignorerer undtagelsen og gør dig i stand til at fortsætte."
# renpy/common/_errorhandling.rpym:628
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Ignorerer undtagelsen og gør dig i stand til at fortsætte. Dette fører ofte til yderligere fejl."
# renpy/common/_errorhandling.rpym:632
old "Reload"
new "Genindlæs"
# renpy/common/_errorhandling.rpym:634
old "Reloads the game from disk, saving and restoring game state if possible."
new "Genindlæser spillet fra disken, gemmer og gendanner spilstatussen hvis muligt."
# renpy/common/_errorhandling.rpym:637
old "Console"
new "Konsol"
# renpy/common/_errorhandling.rpym:639
old "Opens a console to allow debugging the problem."
new "Åbner en konsol for at muliggøre problemløsning."
# renpy/common/_errorhandling.rpym:652
old "Quits the game."
new "Afslutter spillet."
# renpy/common/_errorhandling.rpym:673
old "Parsing the script failed."
new "Fortolkning af manuskript mislykkedes."
-442
View File
@@ -1,442 +0,0 @@
translate danish strings:
# gui/game/gui.rpy:2
old "## Initialization"
new "## Initialisering"
# gui/game/gui.rpy:5
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
new "## Erklæringen init offset får initialiseringserklæringerne i denne fil til at køre før init-erklæringer i enhver anden fil."
# gui/game/gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## Ved at kalde gui.init nulstilles stilene til fornuftige standardværdier, og bredden og højden af spillet indstilles."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Aktiver tjek efter ugyldige eller ustabile egenskaber i skærme eller transformationer"
# gui/game/gui.rpy:19
old "## GUI Configuration Variables"
new "## GUI-konfigurationsvariabler"
# gui/game/gui.rpy:23
old "## Colors"
new "## Farver"
# gui/game/gui.rpy:25
old "## The colors of text in the interface."
new "## Farverne på tekst i skærmfladen."
# gui/game/gui.rpy:27
old "## An accent color used throughout the interface to label and highlight text."
new "## En accentfarve brugt gennem hele skærmfladen til at markere og fremhæve tekst."
# gui/game/gui.rpy:31
old "## The color used for a text button when it is neither selected nor hovered."
new "## Farven brugt til en tekstknap, når den hverken er valgt eller holdes henover."
# gui/game/gui.rpy:34
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## Small-farven bruges til lille tekst, som skal være lysere/mørkere for at opnå samme effekt."
# gui/game/gui.rpy:38
old "## The color that is used for buttons and bars that are hovered."
new "## Farven, der bruges til knapper og bjælker, hvor markøren holdes henover."
# gui/game/gui.rpy:41
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## Farven, der bruges til en tekstknap, når den er valgt men ikke i fokus. En knap er valgt, hvis den er den nuværende skærm- eller præferenceværdi."
# gui/game/gui.rpy:45
old "## The color used for a text button when it cannot be selected."
new "## Farven, der bruges til en tekstknap, når den ikke kan vælges."
# gui/game/gui.rpy:48
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## Farven, der bruges til de dele af bjælker, der ikke er udfyldt. Disse bruges ikke direkte, men bruges, når bjælkebilledfilerne regenereres."
# gui/game/gui.rpy:53
old "## The colors used for dialogue and menu choice text."
new "## Farverne brugt til dialogtekst og tekst i menupunkter."
# gui/game/gui.rpy:58
old "## Fonts and Font Sizes"
new "## Skrifttyper og -størrelser"
# gui/game/gui.rpy:60
old "## The font used for in-game text."
new "## Skrifttypen brugt til tekst i spillet."
# gui/game/gui.rpy:63
old "## The font used for character names."
new "## Skrifttypen brugt til figurnavne."
# gui/game/gui.rpy:66
old "## The font used for out-of-game text."
new "## Skrifttypen brugt til tekst uden for spillet."
# gui/game/gui.rpy:69
old "## The size of normal dialogue text."
new "## Størrelsen på normal dialogtekst."
# gui/game/gui.rpy:72
old "## The size of character names."
new "## Størrelsen på figurnavne."
# gui/game/gui.rpy:75
old "## The size of text in the game's user interface."
new "## Størrelsen på tekst i spillets brugerflade."
# gui/game/gui.rpy:78
old "## The size of labels in the game's user interface."
new "## Størrelsen på mærkater i spillets brugeflade."
# gui/game/gui.rpy:81
old "## The size of text on the notify screen."
new "## Størrelsen på teksten på notifikationsskærmen."
# gui/game/gui.rpy:84
old "## The size of the game's title."
new "## Størrelsen på spillets titel."
# gui/game/gui.rpy:88
old "## Main and Game Menus"
new "## Hoved- og spilmenuer"
# gui/game/gui.rpy:90
old "## The images used for the main and game menus."
new "## Billederne brugt til hoved- og spilmenuerne."
# gui/game/gui.rpy:95
old "## Dialogue"
new "## Dialog"
# gui/game/gui.rpy:97
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## Disse variabler kontrollerer, hvordan dialog vises på skærmen én linje ad gangen."
# gui/game/gui.rpy:100
old "## The height of the textbox containing dialogue."
new "## Højden af tekstboksen, der indeholder dialog."
# gui/game/gui.rpy:103
old "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
new "## Placeringen af tekstboksen lodret på skærmen. 0.0 er i toppen, 0.5 er midti og 1.0 er i bunden."
# gui/game/gui.rpy:108
old "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
new "## Placeringen af den talende figurs navn relativt til tekstboksen. Disse kan være et helt antal af pixels fra venstre eller toppen, eller 0.5 for centrering."
# gui/game/gui.rpy:113
old "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
new "## Den vandrette justering af figurens navn. Denne kan være 0.0 for venstrejusteret, 0.5 for centreret og 1.0 for højrejusteret."
# gui/game/gui.rpy:117
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## Bredden, højden og kanterne på boksen, der indeholder figurens navn, eller None for automatisk at indstille størrelsen."
# gui/game/gui.rpy:122
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## Kanterne på boksen, der indeholder figurens navn, i rækkefølgen venstre, top, højre, bund."
# gui/game/gui.rpy:126
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Ved True bliver navneboksens baggrund gentaget. Ved False bliver navneboksens baggrund skaleret."
# gui/game/gui.rpy:131
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
new "## Placeringen af dialogen relativt til tekstboksen. Disse kan være et heltal af pixels relativt til venstre eller øverste side af tekstboksen, eller 0.5 for at centrere."
# gui/game/gui.rpy:137
old "## The maximum width of dialogue text, in pixels."
new "## Den maksimale bredde af dialogtekst i pixels."
# gui/game/gui.rpy:140
old "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
new "## Den vandrette justering af dialogteksten. Dette kan være 0.0 for venstrejusteret, 0.5 for centreret og 1.0 for højrejusteret."
# gui/game/gui.rpy:145
old "## Buttons"
new "## Knapper"
# gui/game/gui.rpy:147
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## Disse variable kontrollerer sammen med billedfilerne i gui/button aspekter af, hvordan knapper vises."
# gui/game/gui.rpy:150
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## Bredden og højden af en knap i pixels. Hvis None beregner Ren'Py en størrelse."
# gui/game/gui.rpy:154
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## Kanterne på hver side af knappen i rækkefølgen venstre, top, højre, bund."
# gui/game/gui.rpy:157
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## Ved True gentages baggrundsbilledet. Ved False bliver baggrundsbilledet skaleret lineært."
# gui/game/gui.rpy:161
old "## The font used by the button."
new "## Skrifttypen brugt af knappen."
# gui/game/gui.rpy:164
old "## The size of the text used by the button."
new "## Størrelsen af tekst brugt af knappen."
# gui/game/gui.rpy:167
old "## The color of button text in various states."
new "## Farven af knappen i forskellige tilstande."
# gui/game/gui.rpy:173
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
new "## Den vandrette justering af knapteksten. (0.0 er venstre, 0.5 er midtfor, 1.0 er højre)."
# gui/game/gui.rpy:178
old "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
new "## Disse variabler tilsidesætter indstillinger for forskellige typer knapper. Se venligst GUI-dokumentationen for typen af knapper, der er tilgængelige, og hvad hver af dem bruges til."
# gui/game/gui.rpy:182
old "## These customizations are used by the default interface:"
new "## Disse tilpasninger bruger af standardgrænsefladen:"
# gui/game/gui.rpy:197
old "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
new "## Du kan også tilføje dine egne tilpasninger ved at tilføje variabler med det korrekte navn. For eksempel kan du afkommentere følgende linje for at angive bredden på en navigationsknap."
# gui/game/gui.rpy:204
old "## Choice Buttons"
new "## Valgmulighedsknapper"
# gui/game/gui.rpy:206
old "## Choice buttons are used in the in-game menus."
new "## Valgmulighedsknapper bruges i menuerne i spillet."
# gui/game/gui.rpy:220
old "## File Slot Buttons"
new "## Filpladsknapper"
# gui/game/gui.rpy:222
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
new "## En filpladsknap er en speciel slags knap. Den indeholder et miniaturebillede og tekst, der beskriver indholdet af gemmepladsen. En gemmeplads bruger billedfiler i gui/button ligesom de andre slags knapper."
# gui/game/gui.rpy:226
old "## The save slot button."
new "## Gemmepladsknappen."
# gui/game/gui.rpy:236
old "## The width and height of thumbnails used by the save slots."
new "## Bredden og højden af miniaturebilleder brugt af gemmepladserne."
# gui/game/gui.rpy:240
old "## The number of columns and rows in the grid of save slots."
new "## Antallet af søjler og rækker i gitteret med gemmepladser."
# gui/game/gui.rpy:245
old "## Positioning and Spacing"
new "## Positionering og afstand"
# gui/game/gui.rpy:247
old "## These variables control the positioning and spacing of various user interface elements."
new "## Disse variable kontrollerer placering af og afstanden mellem forskellige brugerfladeelementer."
# gui/game/gui.rpy:250
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## Placeringen af venstre side af navigationsknapperne, relativt til venstre side af skærmen."
# gui/game/gui.rpy:254
old "## The vertical position of the skip indicator."
new "## Den lodrette placering af overspringningsindikatoren."
# gui/game/gui.rpy:257
old "## The vertical position of the notify screen."
new "## Den lodrette placering af notifikationsskærmen."
# gui/game/gui.rpy:260
old "## The spacing between menu choices."
new "## Afstanden mellem menuvalg."
# gui/game/gui.rpy:263
old "## Buttons in the navigation section of the main and game menus."
new "## Knapper i navigationssektionen af hoved- og spilmenuerne."
# gui/game/gui.rpy:266
old "## Controls the amount of spacing between preferences."
new "## Kontrollerer mængden af afstand mellem præferencer."
# gui/game/gui.rpy:269
old "## Controls the amount of spacing between preference buttons."
new "## Kontrollerer mængden af afstand mellem præferenceknapper."
# gui/game/gui.rpy:272
old "## The spacing between file page buttons."
new "## Afstanden mellem filsideknapper."
# gui/game/gui.rpy:275
old "## The spacing between file slots."
new "## Afstanden mellem filpladser."
# gui/game/gui.rpy:278
old "## The position of the main menu text."
new "## Placeringen af hovedmenuteksten."
# gui/game/gui.rpy:282
old "## Frames"
new "## Rammer"
# gui/game/gui.rpy:284
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## Disse variable kontrollerer udseendet på rammer, der kan indeholde brugefladekomponenter, når en overlejring eller et vindue ikke er til stede."
# gui/game/gui.rpy:287
old "## Generic frames."
new "## Generiske rammer."
# gui/game/gui.rpy:290
old "## The frame that is used as part of the confirm screen."
new "## Rammen, der bruges som del af bekræftelsesskærmen."
# gui/game/gui.rpy:293
old "## The frame that is used as part of the skip screen."
new "## Rammen, der bruges som del af overspringningsskærmen."
# gui/game/gui.rpy:296
old "## The frame that is used as part of the notify screen."
new "## Rammen, der bruges som del af notifikationsskærmen."
# gui/game/gui.rpy:299
old "## Should frame backgrounds be tiled?"
new "## Bør rammebaggrunde gentages?"
# gui/game/gui.rpy:303
old "## Bars, Scrollbars, and Sliders"
new "## Bjælker, rullebjælker og skydere"
# gui/game/gui.rpy:305
old "## These control the look and size of bars, scrollbars, and sliders."
new "## Disse kontrollerer udseendet og størrelsen på bjælker, rullebjælker og skydere."
# gui/game/gui.rpy:307
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
new "## Standard-GUI'en bruger kun skydere og lodrette rullebjælker. Alle de andre bjælker bruges kun i skærme skrevet af spiludvikleren."
# gui/game/gui.rpy:310
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Højden på vandrette bjælker, rullebjælker og skydere. Bredden på lodrette bjælker, rullebjælker og skydere."
# gui/game/gui.rpy:316
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## True, hvis bjælkebilleder skal gentages. False, hvis de skal skaleres lineært."
# gui/game/gui.rpy:321
old "## Horizontal borders."
new "## Vandrette kanter."
# gui/game/gui.rpy:326
old "## Vertical borders."
new "## Lodrette kanter."
# gui/game/gui.rpy:331
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## Hvad der skal gøres ved urullelige rullebjælker i gui'en. \"hide\" skjuler dem, mens None viser dem."
# gui/game/gui.rpy:336
old "## History"
new "## Historik"
# gui/game/gui.rpy:338
old "## The history screen displays dialogue that the player has already dismissed."
new "## Historikskærmen viser dialog, som spilleren allerede er gået videre fra."
# gui/game/gui.rpy:340
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## Antallet af blokke dialoghistorik, som Ren'Py gemmer."
# gui/game/gui.rpy:343
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## Højden på et historikskærmsindlæg, eller None for at gøre højden variabel på bekostning af ydeevne."
# gui/game/gui.rpy:347
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Placeringen, bredden og justeringen af mærkatet, der angiver navnet på den talende figur."
# gui/game/gui.rpy:354
old "## The position, width, and alignment of the dialogue text."
new "## Placeringen, bredden og justeringen af dialogteksten."
# gui/game/gui.rpy:361
old "## NVL-Mode"
new "## NVL-tilstand"
# gui/game/gui.rpy:363
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## NVL-tilstandsskærmen viser dialogen sagt af NVL-tilstandsfigurer."
# gui/game/gui.rpy:365
old "## The borders of the background of the NVL-mode background window."
new "## Kanterne på baggrunden af baggrundsvinduet i NVL-tilstand."
# gui/game/gui.rpy:368
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
new "## Det maksimale antal af NVL-tilstandsindlæg, som Ren'Py viser. Når flere indlæg end disse skal vises, bliver det ældste indlæg fjernet."
# gui/game/gui.rpy:372
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## Højden på et NVL-tilstandsindlæg. Stil denne til None for at få indlæggene til dynamisk at justere højde."
# gui/game/gui.rpy:376
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## Afstanden mellem NVL-tilstandsindlæg, når gui.nvl_height er None, og mellem NVL-tilstandsindlæg og en menu i NVL-tilstand."
# gui/game/gui.rpy:393
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## Placeringen, bredden og justeringen af nvl_thought-tekst (teksten sagt af figuren nvl_narrator.)"
# gui/game/gui.rpy:400
old "## The position of nvl menu_buttons."
new "## Placeringen af nvl menu_buttons."
# gui/game/gui.rpy:405
old "## Localization"
new "## Lokalisering"
# gui/game/gui.rpy:407
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
new "## Dette kontrollerer, hvor et linjeskift er tilladt. Standardinstilligen er egnet til de fleste sprog. En liste over tilgængelige værdier kan findes på https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# gui/game/gui.rpy:415
old "## Mobile devices"
new "## Mobilenheder"
# gui/game/gui.rpy:420
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## Dette øger størrelsen på hurtigknapperne for at gøre dem lettere at ramme på tablets og mobiler."
# gui/game/gui.rpy:427
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## Dette ændrer størrelsen på og afstanden mellem forskellige GUI-elementer for at sørge for, at de er let synlige på mobiler."
# gui/game/gui.rpy:432
old "## Font sizes."
new "## Skriftstørrelser."
# gui/game/gui.rpy:440
old "## Adjust the location of the textbox."
new "## Juster tekstboksens placering."
# gui/game/gui.rpy:446
old "## Change the size and spacing of various things."
new "## Ændr størrelsen på og afstanden mellem forskellige ting."
# gui/game/gui.rpy:460
old "## File button layout."
new "## Filknapudformning."
# gui/game/gui.rpy:464
old "## NVL-mode."
new "## NVL-tilstand."
# gui/game/gui.rpy:347
old "## Additional space to add between history screen entries."
new "## Yderligere afstand at tilføje mellem historikskærmsindlæg."
File diff suppressed because it is too large Load Diff
-26
View File
@@ -1,26 +0,0 @@
translate danish strings:
# renpy/common/_layout/classic_joystick_preferences.rpym:94
old "Joystick Mapping"
new "Styrepindskortlægning"
# renpy/common/_layout/classic_load_save.rpym:138
old "Empty Slot."
new "Tom plads."
# renpy/common/_layout/classic_load_save.rpym:170
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:179
old "q"
new "h"
# renpy/common/_compat/gamemenu.rpym:355
old "Previous"
new "Forrige"
# renpy/common/_compat/gamemenu.rpym:362
old "Next"
new "Næste"
-198
View File
@@ -1,198 +0,0 @@
translate danish strings:
# gui/game/options.rpy:1
old "## This file contains options that can be changed to customize your game."
new "## Denne fil indeholder indstillinger, der kan ændres for at tilpasse dit spil."
# gui/game/options.rpy:4
old "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
new "## Linjer, der begynder med to '#'-tegn er kommentarer, og du bør ikke afkommentere dem. Linjer, der begynder med et enkelt '#'-tegn er udkommenteret kode, som du kan afkommentere i passende tilfælde."
# gui/game/options.rpy:10
old "## Basics"
new "## Grundlæggende"
# gui/game/options.rpy:12
old "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
new "## Et menneskelæsbart navn på spillet. Dette bruges til at angive standardvinduestitlen, og det dukker op i grænsefladen og fejlrapporter."
# gui/game/options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## Tegnene _(), der omringer strengen, markerer det som kvalificeret til oversættelse."
# gui/game/options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 standard-GUI"
# gui/game/options.rpy:20
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
new "## Bestemmer, om den ovenfor givne titel vises på hovedmenuskærmen. Stil dette til False for at skjule title."
# gui/game/options.rpy:26
old "## The version of the game."
new "## Spilversionen."
# gui/game/options.rpy:31
old "## Text that is placed on the game's about screen. Place the text between the triple-quotes, and leave a blank line between paragraphs."
new "## Tekst, der placeres på spillets om-skærm. Placer teksten mellem de tredobbelte citationstegn og efterlad en tom linje mellem afsnit."
# gui/game/options.rpy:38
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## Et kort navn til spillet, der bruges til ekskverbare filer og mapper i den fremstillede distribution. Dette må kun være ASCII, og det må ikke indeholde mellemrum, koloner eller semikoloner."
# gui/game/options.rpy:45
old "## Sounds and music"
new "## Lyde og musik"
# gui/game/options.rpy:47
old "## These three variables control, among other things, which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
new "## Disse tre variabler kontrollerer blandt andet, hvilke mixere der vises til spilleren som standard. Ved at stille en af disse til False skjules den tilsvarende mixer."
# gui/game/options.rpy:56
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
new "## For at gøre det muligt for brugeren at afspille en testlyd på lydeffekt- eller stemmekanalen, så afkommenter en linje nedenfor og brug den til at angive en prøvelyd at afspille."
# gui/game/options.rpy:63
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
new "## Afkommenter følgende linje for at angive en lydfil, der afspilles, mens spilleren er i hovedmenuen. Denne fil fortsætter med at afspille inde i spillet, indtil den stoppes, eller en anden fil afspilles."
# gui/game/options.rpy:70
old "## Transitions"
new "## Overgange"
# gui/game/options.rpy:72
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
new "## Disse variable angiver overgange, der bruges, når bestemte begivenheder opstår. Hver variabel bør sættes til en overgang, eller til None for at indikere, at ingen overgang skal bruges."
# gui/game/options.rpy:76
old "## Entering or exiting the game menu."
new "## Når man går ind i eller ud af spilmenuen."
# gui/game/options.rpy:82
old "## Between screens of the game menu."
new "## Mellem skærme i spilmenuen."
# gui/game/options.rpy:87
old "## A transition that is used after a game has been loaded."
new "## En overgang, der bruges, efter et spil er blevet indlæst."
# gui/game/options.rpy:92
old "## Used when entering the main menu after the game has ended."
new "## Bruges, når man går ind i hovedmenuen, efter spillet er sluttet."
# gui/game/options.rpy:97
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
new "## Der findes ingen variabel til at angive overgangen, der bruges, når spillet startes. Brug i stedet en with-sætning efter visning af den første scene."
# gui/game/options.rpy:102
old "## Window management"
new "## Vinduesstyring"
# gui/game/options.rpy:104
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
new "## Dette kontrollerer, hvornår dialogvinduet vises. Ved \"show\" vises det altid. Ved \"hide\" vises det kun, når dialog er til stede. Ved \"auto\" skjules vinduet før scene-sætninger og vises igen, når dialog vises."
# gui/game/options.rpy:109
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## Efter spillet er startet, kan dette ændres med sætningerne \"window show\", \"window hide\", og \"window auto\"."
# gui/game/options.rpy:115
old "## Transitions used to show and hide the dialogue window"
new "## Overgange brugt til at vise og skjule dialogvinduet"
# gui/game/options.rpy:121
old "## Preference defaults"
new "## Standardpræferencer"
# gui/game/options.rpy:123
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Kontrollerer standardteksthastigheden. Standarden, 0, er uendelig, mens ethvert andet tal er antallet af tegn pr. sekund, der skrives."
# gui/game/options.rpy:129
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## Standardforsinkelsen for auto-fremad. Større tal fører til længere ventetider, med 0 til 30 som den gyldige rækkevidde."
# gui/game/options.rpy:135
old "## Save directory"
new "## Gemmefilmappe"
# gui/game/options.rpy:137
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
new "## Kontrollerer det platformspecifikke sted, hvorpå Ren'Py placerer gemmefilerne for dette spil. Gemmefilerne bliver placeret i:"
# gui/game/options.rpy:140
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
# gui/game/options.rpy:142
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
# gui/game/options.rpy:144
old "## Linux: $HOME/.renpy/<config.save_directory>"
new "## Linux: $HOME/.renpy/<config.save_directory>"
# gui/game/options.rpy:146
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
new "## Dette bør generelt ikke ændres, og hvis det bliver, bør det altid være en litteral streng, ikke et udtryk."
# gui/game/options.rpy:152
old "## Icon"
new "## Ikon"
# gui/game/options.rpy:154
old "## The icon displayed on the taskbar or dock."
new "## Ikonet vises på proceslinjen eller docken."
# gui/game/options.rpy:159
old "## Build configuration"
new "## Fremstillingskonfiguration"
# gui/game/options.rpy:161
old "## This section controls how Ren'Py turns your project into distribution files."
new "## Denne sektion kontrollerer, hvordan Ren'Py laver dit projekt om til distributionsfiler."
# gui/game/options.rpy:166
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## De følgende funktioner tager filmønstre. I filmønstre skelnes der ikke mellem små og store bogstaver, og de matches mod filstien relativt til grundmappen med og uden et foranstående /. Hvis flere mønstre matcher, bruges det første."
# gui/game/options.rpy:171
old "## In a pattern:"
new "## I et mønster:"
# gui/game/options.rpy:173
old "## / is the directory separator."
new "## / er mappeseparatoren."
# gui/game/options.rpy:175
old "## * matches all characters, except the directory separator."
new "## * matcher alle tegn bortset fra mappeseparatoren."
# gui/game/options.rpy:177
old "## ** matches all characters, including the directory separator."
new "## ** matcher alle tegn inklusiv mappeseparatoren."
# gui/game/options.rpy:179
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## For eksempel matcher \"*.txt\" txt-filer i grundmappen, \"game/**.ogg\" matcher ogg-filer i mappen game eller en hvilken som helst af dens undermapper, og \"**.psd\" matcher psd-filer hvor som helst i projektet."
# gui/game/options.rpy:183
old "## Classify files as None to exclude them from the built distributions."
new "## Klassificer filer som None for at ekskludere dem fra de fremstilte distributioner."
# gui/game/options.rpy:191
old "## To archive files, classify them as 'archive'."
new "## Klassificer filer som 'archive' for at arkivere dem."
# gui/game/options.rpy:196
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
new "## Filer, der matcher dokumentationsmønstre, duplikeres i fremstillingen af en mac-app, så de optræder både i appen og zip-filen."
# gui/game/options.rpy:203
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
new "## En Google Play-licensnøgle er påkrævet for at udføre in-app-betalinger. Den kan findes i Google Play-udviklerkonsollen under \"Tjen penge\" > \"Konfiguration af indtægtsgenerering\" > \"Licens\"."
# gui/game/options.rpy:210
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## Brugernavnet og projektnavnen forbundet med et itch.io-projekt, adskilt med en skåstreg."
-678
View File
@@ -1,678 +0,0 @@
translate danish strings:
# gui/game/screens.rpy:9
old "## Styles"
new "## Stile"
# gui/game/screens.rpy:81
old "## In-game screens"
new "## Skærme i spillet"
# gui/game/screens.rpy:85
old "## Say screen"
new "## Dialogskærmen"
# gui/game/screens.rpy:87
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## Dialogskærmen bruges til at vise dialog til spilleren. Den tager to parametre, who (hvem) og what (hvad), som henholdsvis er navnet på den talende figur og teksten, der skal vises. (Parametren who kan være None, hvis intet navn angives.)"
# gui/game/screens.rpy:92
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
new "## Denne skærm skal oprette et visbart tekstelement med id'et \"what\", da Ren'Py bruger denne til at styre tekstvisning. Den kan også oprette visbare elementer med id'et \"who\" og id'et \"window\" for at anvende stilegenskaber."
# gui/game/screens.rpy:96
old "## https://www.renpy.org/doc/html/screen_special.html#say"
new "## https://www.renpy.org/doc/html/screen_special.html#say"
# gui/game/screens.rpy:114
old "## If there's a side image, display it above the text. Do not display on the phone variant - there's no room."
new "## Hvis der er et sidebillede, så vis det over teksten. Vis ikke på mobilvarianten - der er ikke plads."
# gui/game/screens.rpy:120
old "## Make the namebox available for styling through the Character object."
new "## Gør navneboksen tilgængelig for stilisering gennem Character-objektet."
# gui/game/screens.rpy:165
old "## Input screen"
new "## Inputskærmen"
# gui/game/screens.rpy:167
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## Denne skærm bruges til at vise renpy.input. Promptparameteren bruges til at føre en tekstprompt ind."
# gui/game/screens.rpy:170
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## Denne skærm skal oprette et visbart inputelement med id'et \"input\" for at acceptere de forskellige inputparametre."
# gui/game/screens.rpy:173
old "## https://www.renpy.org/doc/html/screen_special.html#input"
new "## https://www.renpy.org/doc/html/screen_special.html#input"
# gui/game/screens.rpy:200
old "## Choice screen"
new "## Valgmulighedsskærmen"
# gui/game/screens.rpy:202
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
new "## Denne skærm bruges til at vise valg i spillet præsenteret af menu-sætningen. Den ene parameter, items, er en liste af objekter, hver med caption- og action-felter."
# gui/game/screens.rpy:206
old "## https://www.renpy.org/doc/html/screen_special.html#choice"
new "## https://www.renpy.org/doc/html/screen_special.html#choice"
# gui/game/screens.rpy:234
old "## Quick Menu screen"
new "## Hurtigmenuskærmen"
# gui/game/screens.rpy:236
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## Hurtigmenuen vises i spillet for at give let adgang til menuerne uden for spillet."
# gui/game/screens.rpy:241
old "## Ensure this appears on top of other screens."
new "## Sørg for at denne vises oven på andre skærme."
# gui/game/screens.rpy:252
old "Back"
new "Tilbage"
# gui/game/screens.rpy:253
old "History"
new "Historik"
# gui/game/screens.rpy:254
old "Skip"
new "Spring over"
# gui/game/screens.rpy:255
old "Auto"
new "Auto"
# gui/game/screens.rpy:256
old "Save"
new "Gem"
# gui/game/screens.rpy:257
old "Q.Save"
new "H.gem"
# gui/game/screens.rpy:258
old "Q.Load"
new "H.indlæs"
# gui/game/screens.rpy:259
old "Prefs"
new "Præf."
# gui/game/screens.rpy:262
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
new "## Denne kode sørger for at quick_menu-skærmen vises i spillet, når end spilleren ikke eksplicit har skjult grænsefladen."
# gui/game/screens.rpy:280
old "## Main and Game Menu Screens"
new "## Hoved- og spilmenuskærme"
# gui/game/screens.rpy:283
old "## Navigation screen"
new "## Navigationsskærmen"
# gui/game/screens.rpy:285
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
new "## Denne skærm er inkluderet i hoved- og spilmenuerne og giver navigation til andre menuer og til at starte spillet."
# gui/game/screens.rpy:300
old "Start"
new "Start"
# gui/game/screens.rpy:308
old "Load"
new "Indlæs"
# gui/game/screens.rpy:310
old "Preferences"
new "Præferencer"
# gui/game/screens.rpy:314
old "End Replay"
new "Slut genafspilning"
# gui/game/screens.rpy:318
old "Main Menu"
new "Hovedmenu"
# gui/game/screens.rpy:320
old "About"
new "Om"
# gui/game/screens.rpy:324
old "## Help isn't necessary or relevant to mobile devices."
new "## Hjælp er ikke nødvendig eller relevant for mobilenheder."
# gui/game/screens.rpy:325
old "Help"
new "Hjælp"
# gui/game/screens.rpy:329
old "## The quit button is banned on iOS and unnecessary on Android and Web."
new "## Afslut-knappen er forbudt på iOS og unødvendig på Android og web."
# gui/game/screens.rpy:330
old "Quit"
new "Afslut"
# gui/game/screens.rpy:344
old "## Main Menu screen"
new "## Hovedmenuskærmen"
# gui/game/screens.rpy:346
old "## Used to display the main menu when Ren'Py starts."
new "## Bruges til at vise hovedmenuen, når Ren'Py starter."
# gui/game/screens.rpy:348
old "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
new "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
# gui/game/screens.rpy:352
old "## This ensures that any other menu screen is replaced."
new "## Dette sikrer, at andre eventuelle menuskærme erstattes."
# gui/game/screens.rpy:357
old "## This empty frame darkens the main menu."
new "## Denne tomme ramme mørkner hovedmenuen."
# gui/game/screens.rpy:361
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## Sætningen use inkluderer en anden skærm inde i denne. Det faktiske indhold af hovedmenuen er i navigationsskærmen."
# gui/game/screens.rpy:406
old "## Game Menu screen"
new "## Spilmenuskærmen"
# gui/game/screens.rpy:408
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
new "## Denne udlægger de grundlæggende fællesstrukturer for en spilmenuskærm. Den kaldes med screen-titlen og viser baggrunden, titlen og navigationen."
# gui/game/screens.rpy:411
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## Parameteren scroll kan være None eller en af \"viewport\" eller \"vpgrid\". Denne skærm er tiltænkt at blive brugt med et eller flere børn, som transkluderes (placeres) inde i den."
# gui/game/screens.rpy:429
old "## Reserve space for the navigation section."
new "## Reserver plads til navigationssektionen"
# gui/game/screens.rpy:471
old "Return"
new "Tilbage"
# gui/game/screens.rpy:534
old "## About screen"
new "## Om-skærmen"
# gui/game/screens.rpy:536
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## Denne skærm giver kreditering og ophavsretsinformation om spillet og Ren'Py."
# gui/game/screens.rpy:539
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
new "## Der er intet specielt ved denne skærm, og derfor fungerer den også som et eksempel, på hvordan man laver en skræddersyet skærm."
# gui/game/screens.rpy:546
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
new "## Denne use-sætning inkluderer game_menu-skærmen inde i denne. Barnet vbox inkluderes derefter inde i visningsporten inde i game_menu-skærmen."
# gui/game/screens.rpy:556
old "Version [config.version!t]\n"
new "Version [config.version!t]\n"
# gui/game/screens.rpy:558
old "## gui.about is usually set in options.rpy."
new "## gui.about indstilles sædvanligvis i options.rpy."
# gui/game/screens.rpy:562
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Lavet med {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# gui/game/screens.rpy:573
old "## Load and Save screens"
new "## Indlæsnings- og gemmeskærmene"
# gui/game/screens.rpy:575
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
new "## Disse skærme er ansvarlige for at lade spilleren gemme spillet og indlæse det igen. Siden de har næsten alting tilfælles, implementeres begge i form af en tredje skærm, file_slots."
# gui/game/screens.rpy:579
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
new "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
# gui/game/screens.rpy:598
old "Page {}"
new "Side {}"
# gui/game/screens.rpy:598
old "Automatic saves"
new "Autogemmefiler"
# gui/game/screens.rpy:598
old "Quick saves"
new "Hurtiggemmefiler"
# gui/game/screens.rpy:604
old "## This ensures the input will get the enter event before any of the buttons do."
new "## Dette sikrer, at inputtet får enter-begivenheden før nogen af knapperne gør."
# gui/game/screens.rpy:608
old "## The page name, which can be edited by clicking on a button."
new "## Sidenavnet, som kan redigeres ved at klikke på en knap."
# gui/game/screens.rpy:620
old "## The grid of file slots."
new "## Filpladsgitteret."
# gui/game/screens.rpy:640
old "{#file_time}%A, %B %d %Y, %H:%M"
new "{#file_time}%A, %d %B %Y, %H:%M"
# gui/game/screens.rpy:640
old "empty slot"
new "tom plads"
# gui/game/screens.rpy:648
old "## Buttons to access other pages."
new "## Knapper til at tilgå andre sider."
# gui/game/screens.rpy:660
old "<"
new "<"
# gui/game/screens.rpy:663
old "{#auto_page}A"
new "{#auto_page}A"
# gui/game/screens.rpy:666
old "{#quick_page}Q"
new "{#quick_page}H"
# gui/game/screens.rpy:668
old "## range(1, 10) gives the numbers from 1 to 9."
new "## range(1, 10) giver numrene fra 1 til 9."
# gui/game/screens.rpy:672
old ">"
new ">"
# gui/game/screens.rpy:676
old "Upload Sync"
new "Send synkronisering"
# gui/game/screens.rpy:680
old "Download Sync"
new "Hent synkronisering"
# gui/game/screens.rpy:717
old "## Preferences screen"
new "## Præferenceskærmen"
# gui/game/screens.rpy:719
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## Præferenceskærmen gør det muligt for spilleren at konfigurere spillet til bedre at passe vedkommende."
# gui/game/screens.rpy:722
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
new "## https://www.renpy.org/doc/html/screen_special.html#preferences"
# gui/game/screens.rpy:739
old "Display"
new "Skærmvisning"
# gui/game/screens.rpy:740
old "Window"
new "Vindue"
# gui/game/screens.rpy:741
old "Fullscreen"
new "Fuldskærm"
# gui/game/screens.rpy:746
old "Unseen Text"
new "Uset tekst"
# gui/game/screens.rpy:747
old "After Choices"
new "Efter valg"
# gui/game/screens.rpy:748
old "Transitions"
new "Overgange"
# gui/game/screens.rpy:750
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Yderligere vboxe af typen \"radio_pref\" eller \"check_pref\" kan tilføjes her for at tilføje yderligere udviklerdefinerede præferencer."
# gui/game/screens.rpy:761
old "Text Speed"
new "Teksthastighed"
# gui/game/screens.rpy:765
old "Auto-Forward Time"
new "Tid for auto-fremad"
# gui/game/screens.rpy:772
old "Music Volume"
new "Musiklydstyrke"
# gui/game/screens.rpy:779
old "Sound Volume"
new "Lydeffektlydstyrke"
# gui/game/screens.rpy:785
old "Test"
new "Test"
# gui/game/screens.rpy:789
old "Voice Volume"
new "Stemmelydstyrke"
# gui/game/screens.rpy:800
old "Mute All"
new "Slå alle fra"
# gui/game/screens.rpy:876
old "## History screen"
new "## Historikskærmen"
# gui/game/screens.rpy:878
old "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
new "## Dette er en skærm, der viser dialoghistorikken til spilleren. Mens der ikke er noget særligt ved denne skærm, har den dog adgang til dialoghistorikken opbevaret i _history_list."
# gui/game/screens.rpy:882
old "## https://www.renpy.org/doc/html/history.html"
new "## https://www.renpy.org/doc/html/history.html"
# gui/game/screens.rpy:888
old "## Avoid predicting this screen, as it can be very large."
new "## Undgå at forudsige denne skærm, da den kan være meget stor."
# gui/game/screens.rpy:899
old "## This lays things out properly if history_height is None."
new "## Dette udlægger tingene korrekt, hvis history_height er None."
# gui/game/screens.rpy:909
old "## Take the color of the who text from the Character, if set."
new "## Tag farven fra who-teksten fra en Character, hvis den er angivet."
# gui/game/screens.rpy:918
old "The dialogue history is empty."
new "Dialoghistorikken er tom."
# gui/game/screens.rpy:921
old "## This determines what tags are allowed to be displayed on the history screen."
new "## Dette bestemmer, hvilke mærker der tillades at blive vist på historikskærmen."
# gui/game/screens.rpy:966
old "## Help screen"
new "## Hjælpeskærmen"
# gui/game/screens.rpy:968
old "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
new "## En skærm, der giver information om tastatur- og musetildelinger. Den bruger andre skærme (keyboard_help, mouse_help og gamepad_help) til at vise den faktiske hjælp."
# gui/game/screens.rpy:987
old "Keyboard"
new "Tastatur"
# gui/game/screens.rpy:988
old "Mouse"
new "Mus"
# gui/game/screens.rpy:991
old "Gamepad"
new "Spillekontrol"
# gui/game/screens.rpy:1004
old "Enter"
new "Retur"
# gui/game/screens.rpy:1005
old "Advances dialogue and activates the interface."
new "Går videre i dialog og aktiverer grænsefladen."
# gui/game/screens.rpy:1008
old "Space"
new "Mellemrum"
# gui/game/screens.rpy:1009
old "Advances dialogue without selecting choices."
new "Går videre i dialog uden at træffe valg."
# gui/game/screens.rpy:1012
old "Arrow Keys"
new "Piltaster"
# gui/game/screens.rpy:1013
old "Navigate the interface."
new "Navigerer i grænsefladen."
# gui/game/screens.rpy:1016
old "Escape"
new "Escape"
# gui/game/screens.rpy:1017
old "Accesses the game menu."
new "Tilgår spilmenuen."
# gui/game/screens.rpy:1020
old "Ctrl"
new "Ctrl"
# gui/game/screens.rpy:1021
old "Skips dialogue while held down."
new "Springer over dialog ved nedholdning."
# gui/game/screens.rpy:1024
old "Tab"
new "Tab"
# gui/game/screens.rpy:1025
old "Toggles dialogue skipping."
new "Slår dialogoverspringning til/fra."
# gui/game/screens.rpy:1028
old "Page Up"
new "Page Up"
# gui/game/screens.rpy:1029
old "Rolls back to earlier dialogue."
new "Ruller tilbage til tidligere dialog."
# gui/game/screens.rpy:1032
old "Page Down"
new "Page Down"
# gui/game/screens.rpy:1033
old "Rolls forward to later dialogue."
new "Ruller fremad til senere dialog."
# gui/game/screens.rpy:1037
old "Hides the user interface."
new "Skjuler brugerfladen."
# gui/game/screens.rpy:1041
old "Takes a screenshot."
new "Tager et skærmbillede."
# gui/game/screens.rpy:1045
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Slår assisterende {a=https://www.renpy.org/l/voicing}automatisk oplæsning{/a} til/fra."
# gui/game/screens.rpy:1049
old "Opens the accessibility menu."
new "Åbner tilgængelighedsmenuen."
# gui/game/screens.rpy:1055
old "Left Click"
new "Venstreklik"
# gui/game/screens.rpy:1059
old "Middle Click"
new "Midterklik"
# gui/game/screens.rpy:1063
old "Right Click"
new "Højreklik"
# gui/game/screens.rpy:1067
old "Mouse Wheel Up\nClick Rollback Side"
new "Musehjul op\nKlik på tilbagerulningsside"
# gui/game/screens.rpy:1071
old "Mouse Wheel Down"
new "Musehjul ned"
# gui/game/screens.rpy:1078
old "Right Trigger\nA/Bottom Button"
new "Højre aftrækker\nA/Nederste knap"
# gui/game/screens.rpy:1082
old "Left Trigger\nLeft Shoulder"
new "Venstre aftrækker\nVenstre skulderknap"
# gui/game/screens.rpy:1086
old "Right Shoulder"
new "Højre skulderknap"
# gui/game/screens.rpy:1091
old "D-Pad, Sticks"
new "Retningsknapper, Pinde"
# gui/game/screens.rpy:1095
old "Start, Guide"
new "Start, Guide"
# gui/game/screens.rpy:1098
old "Start, Guide, B/Right Button"
new "Start, Guide, B/Højre knap"
# gui/game/screens.rpy:1099
old "Y/Top Button"
new "Y/Øverste knap"
# gui/game/screens.rpy:1102
old "Calibrate"
new "Kalibrér"
# gui/game/screens.rpy:1130
old "## Additional screens"
new "## Yderligere skærme"
# gui/game/screens.rpy:1134
old "## Confirm screen"
new "## Bekræftelsesskærmen"
# gui/game/screens.rpy:1136
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## Bekræftelsesskærmen kaldes, når Ren'Py vil stille spilleren et ja-nej-spørgsmål."
# gui/game/screens.rpy:1139
old "## https://www.renpy.org/doc/html/screen_special.html#confirm"
new "## https://www.renpy.org/doc/html/screen_special.html#confirm"
# gui/game/screens.rpy:1143
old "## Ensure other screens do not get input while this screen is displayed."
new "## Sørg for, at andre skærme ikke får input, mens denne skærm vises."
# gui/game/screens.rpy:1167
old "Yes"
new "Ja"
# gui/game/screens.rpy:1168
old "No"
new "Nej"
# gui/game/screens.rpy:1170
old "## Right-click and escape answer \"no\"."
new "## Højreklik og undgå svaret \"no\"."
# gui/game/screens.rpy:1197
old "## Skip indicator screen"
new "## Overspringningsindikatorskærmen"
# gui/game/screens.rpy:1199
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## Skærmen skip_indicator vises for at indikere, at overspringning er i gang."
# gui/game/screens.rpy:1202
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
new "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
# gui/game/screens.rpy:1214
old "Skipping"
new "Springer over"
# gui/game/screens.rpy:1221
old "## This transform is used to blink the arrows one after another."
new "## Denne transformation bruges til at blinke med pilene en efter hinanden."
# gui/game/screens.rpy:1248
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
new "## Vi skal bruge en skrifttype, der har tegnet BLACK RIGHT-POINTING SMALL TRIANGLE i sig."
# gui/game/screens.rpy:1253
old "## Notify screen"
new "## Notifikationsskærmen"
# gui/game/screens.rpy:1255
old "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
new "## Notifikationsskærmen bruges til at vise spilleren en besked. (For eksempel når spillet hurtiggemmes, eller når et skærmbillede er blevet taget.)"
# gui/game/screens.rpy:1258
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
new "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
# gui/game/screens.rpy:1292
old "## NVL screen"
new "## NVL-skærmen"
# gui/game/screens.rpy:1294
old "## This screen is used for NVL-mode dialogue and menus."
new "## Denne skærm bruges til dialog og menuer i NVL-tilstand."
# gui/game/screens.rpy:1296
old "## https://www.renpy.org/doc/html/screen_special.html#nvl"
new "## https://www.renpy.org/doc/html/screen_special.html#nvl"
# gui/game/screens.rpy:1307
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Viser dialog i enten et vpgrid eller vboxen."
# gui/game/screens.rpy:1320
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
new "## Viser menuen, hvis angivet. Menuen kan muligvis vises ukorrekt, hvis config.narrator_menu er sat til True."
# gui/game/screens.rpy:1350
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## Dette kontrollerer det maksimale antal af NVL-tilstandsindlæg, der kan vises på én gang."
# gui/game/screens.rpy:1410
old "## Bubble screen"
new "## Talebobleskærmen"
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
new "## Talebobleskærmen bruges til at vise dialog til spilleren ved brug af talebobler. Talebobleskærmen tager imod de samme parametre som dialogskærmen. Den skal oprette et visbart element med id'et \"what\", og den kan oprette visbare elementer med id'erne \"namebox\", \"who\" og \"window\"."
# gui/game/screens.rpy:1417
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
new "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
# gui/game/screens.rpy:1501
old "## Mobile Variants"
new "## Mobilvarianter"
# gui/game/screens.rpy:1508
old "## Since a mouse may not be present, we replace the quick menu with a version that uses fewer and bigger buttons that are easier to touch."
new "## Siden en mus muligvis ikke er til stede, erstatter vi hurtigmenuen med en version, der bruger færre og større knapper, der er lettere at ramme."
# gui/game/screens.rpy:1526
old "Menu"
new "Menu"
-33
View File
@@ -1,33 +0,0 @@
# Spillets manuskript puttes i denne fil.
# Erklær figurer brugt af dette spil. Farveargumentet farver
# navnet på figuren.
define e = Character("Eileen")
# Spillet starter her.
label start:
# Vis en baggrund. Der bruges som standard en stedfortræder, men du kan
# tilføje en fil (kaldt enten "bg room.png" eller "bg room.jpg") til
# mappen images for at vise den.
scene bg room
# Dette viser en figursprite. En stedfortræder bruges, men du kan
# erstatte den ved at tilføje en fil kaldt "eileen happy.png" til
# mappen images.
show eileen happy
# Disse viser linjer med dialog.
e "Du har oprettet et nyt Ren'Py-spil."
e "Når du har tilføjet en historie, billeder og musik, kan du sende det ud i verden!"
# Dette afslutter spillet.
return
+5 -613
View File
@@ -3,7 +3,7 @@ translate finnish strings:
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Maanantai"
new "{#weekday}Maanatai"
# 00action_file.rpy:26
old "{#weekday}Tuesday"
@@ -199,8 +199,7 @@ translate finnish strings:
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
# Automatic translation.
new "Oletko varma, että haluat ohittaa näkymättömän dialogin seuraavaan vaihtoehtoon?"
new "Are you sure you want to skip unseen dialogue to the next choice?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
@@ -224,8 +223,7 @@ translate finnish strings:
# 00library.rpy:262
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
# Automatic translation.
new "Tämä ohjelma sisältää vapaita ohjelmistoja useiden lisenssien alla, mukaan lukien MIT-lisenssi ja GNU Lesser General Public License. Täydellinen luettelo ohjelmistoista, mukaan lukien linkit täydelliseen lähdekoodiin, löytyy {a=https://www.renpy.org/l/license}täältä{/a}."
new "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
@@ -241,8 +239,7 @@ translate finnish strings:
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
# Automatic translation.
new "Yhteydenotto App Storeen\nOdottakaa..."
new "Contacting App Store\nPlease Wait..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
@@ -318,7 +315,7 @@ translate finnish strings:
# 00gallery.rpy:563
old "Image [index] of [count] locked."
new "Kuva [index]/[count] on lukittu."
new "[index]. kuva [count]:stä on lukittu"
# 00gallery.rpy:583
old "prev"
@@ -336,608 +333,3 @@ translate finnish strings:
old "return"
new "palaa"
translate finnish strings:
# renpy/common/00accessibility.rpy:32
old "bar"
new "palkki"
# renpy/common/00accessibility.rpy:33
old "selected"
# Automatic translation.
new "valittu"
# renpy/common/00accessibility.rpy:34
old "viewport"
new "viewport"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
# Automatic translation.
new "vaakasuora vieritys"
# renpy/common/00accessibility.rpy:36
old "vertical scroll"
# Automatic translation.
new "pystysuora vieritys"
# renpy/common/00accessibility.rpy:37
old "activate"
# Automatic translation.
new "aktivoi"
# renpy/common/00accessibility.rpy:38
old "deactivate"
# Automatic translation.
new "deaktivoi"
# renpy/common/00accessibility.rpy:39
old "increase"
new "lisää"
# renpy/common/00accessibility.rpy:40
old "decrease"
new "vähennä"
# renpy/common/00accessibility.rpy:138
old "Font Override"
# Automatic translation.
new "Fontin ohitus"
# renpy/common/00accessibility.rpy:142
old "Default"
# Automatic translation.
new "Oletus"
# renpy/common/00accessibility.rpy:146
old "DejaVu Sans"
new "DejaVu Sans"
# renpy/common/00accessibility.rpy:150
old "Opendyslexic"
new "Opendyslexic"
# renpy/common/00accessibility.rpy:156
old "Text Size Scaling"
# Automatic translation.
new "Tekstin koon skaalaus"
# renpy/common/00accessibility.rpy:162
old "Reset"
# Automatic translation.
new "Nollaa"
# renpy/common/00accessibility.rpy:168
old "Line Spacing Scaling"
new "Rivivälin skaalaus"
# renpy/common/00accessibility.rpy:180
old "High Contrast Text"
# Automatic translation.
new "Korkean kontrastin teksti"
# renpy/common/00accessibility.rpy:193
old "Self-Voicing"
new "Tietokoneen ääninäyttely"
# renpy/common/00accessibility.rpy:197
old "Off"
new "Pois päältä"
# renpy/common/00accessibility.rpy:201
old "Text-to-speech"
# Automatic translation.
new "Tekstistä puheeksi"
# renpy/common/00accessibility.rpy:205
old "Clipboard"
# Automatic translation.
new "Leikepöytä"
# renpy/common/00accessibility.rpy:209
old "Debug"
# Automatic translation.
new "Vianmääritys"
# renpy/common/00accessibility.rpy:223
old "Self-Voicing Volume Drop"
new "Tietokoneen ääninäyttelyn äänenvoimakkuuden pudotus"
# renpy/common/00accessibility.rpy:234
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
new "Tämän valikon vaihtoehtojen tarkoituksena on parantaa saavutettavuutta. Ne eivät välttämättä toimi kaikissa peleissä, ja joidenkin vaihtoehtojen yhdistelmät saattavat tehdä pelistä pelikelvottoman. Tämä ei johdu pelistä tai moottorista. Saat fontteja vaihtaessa parhaat tulokset kun yrität pitää tekstin koon samana kuin se oli alun perin."
# renpy/common/00action_file.rpy:378
old "Save slot %s: [text]"
new "Tallennuspaikka %s: [text]"
# renpy/common/00action_file.rpy:461
old "Load slot %s: [text]"
new "Lataa tallennus %s: [text]"
# renpy/common/00action_file.rpy:514
old "Delete slot [text]"
new "Poista tallennus [text]"
# renpy/common/00action_file.rpy:593
old "File page auto"
new "Tiedoston sivu: auto"
# renpy/common/00action_file.rpy:595
old "File page quick"
new "Tiedoston sivu: pika"
# renpy/common/00action_file.rpy:597
old "File page [text]"
new "Tiedoston sivu: [text]"
# renpy/common/00action_file.rpy:796
old "Next file page."
new "Seuraava tiedoston sivu."
# renpy/common/00action_file.rpy:868
old "Previous file page."
new "Edellinen tiedoston sivu."
# renpy/common/00action_file.rpy:944
old "Quick save."
new "Pikatallennus."
# renpy/common/00action_file.rpy:963
old "Quick load."
# Automatic translation.
new "Pikalataus."
# renpy/common/00action_other.rpy:381
old "Language [text]"
# Automatic translation.
new "Kieli [text]"
# renpy/common/00director.rpy:705
old "The interactive director is not enabled here."
# Automatic translation.
new "Vuorovaikutteinen ohjaaja ei ole käytössä täällä."
# renpy/common/00director.rpy:1504
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1510
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1574
old "Done"
# Automatic translation.
new "Valmis"
# renpy/common/00director.rpy:1584
old "(statement)"
# Automatic translation.
new "(lausunto)"
# renpy/common/00director.rpy:1585
old "(tag)"
new "(tag)"
# renpy/common/00director.rpy:1586
old "(attributes)"
# Automatic translation.
new "(attribuutit)"
# renpy/common/00director.rpy:1587
old "(transform)"
new "(transform)"
# renpy/common/00director.rpy:1612
old "(transition)"
new "(transition)"
# renpy/common/00director.rpy:1624
old "(channel)"
# Automatic translation.
new "(kanava)"
# renpy/common/00director.rpy:1625
old "(filename)"
# Automatic translation.
new "(tiedostonimi)"
# renpy/common/00director.rpy:1654
old "Change"
# Automatic translation.
new "Muuta"
# renpy/common/00director.rpy:1656
old "Add"
# Automatic translation.
new "Lisää"
# renpy/common/00director.rpy:1662
old "Remove"
# Automatic translation.
new "Poista"
# renpy/common/00director.rpy:1697
old "Statement:"
# Automatic translation.
new "Lausunto:"
# renpy/common/00director.rpy:1718
old "Tag:"
new "Tag:"
# renpy/common/00director.rpy:1734
old "Attributes:"
# Automatic translation.
new "Ominaisuudet:"
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
# Automatic translation.
new "Napsauttamalla voit vaihtaa attribuuttia, oikealla napsauttamalla voit vaihtaa negatiivista attribuuttia."
# renpy/common/00director.rpy:1757
old "Transforms:"
# Automatic translation.
new "Muuntuu:"
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
# Automatic translation.
new "Napsauta aseta muunnos, lisää muunnosluetteloon napsauttamalla hiiren kakkospainiketta."
# renpy/common/00director.rpy:1780
old "Behind:"
# Automatic translation.
new "Takana:"
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
# Automatic translation.
new "Aseta napsauttamalla, lisää takaluetteloon napsauttamalla hiiren kakkospainiketta."
# renpy/common/00director.rpy:1801
old "Transition:"
# Automatic translation.
new "Siirtyminen:"
# renpy/common/00director.rpy:1819
old "Channel:"
# Automatic translation.
new "Kanava:"
# renpy/common/00director.rpy:1837
old "Audio Filename:"
# Automatic translation.
new "Äänitiedoston nimi:"
# renpy/common/00gui.rpy:456
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
# Automatic translation.
new "Tämä tallennus on luotu eri laitteella. Pahantahtoisesti tehdyt tallennustiedostot voivat vahingoittaa tietokonettasi. Luotatko tämän tallennuksen tekijään ja kaikkiin, jotka ovat voineet muuttaa tiedostoa?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
# Automatic translation.
new "Luotatko laitteeseen, jolla tallennus luotiin? Valitse kyllä vain, jos olet laitteen ainoa käyttäjä."
# renpy/common/00keymap.rpy:322
old "Failed to save screenshot as %s."
# Automatic translation.
new "Kuvakaappauksen tallentaminen nimellä %s epäonnistui."
# renpy/common/00preferences.rpy:271
old "display"
# Automatic translation.
new "näyttö"
# renpy/common/00preferences.rpy:283
old "transitions"
# Automatic translation.
new "siirtymät"
# renpy/common/00preferences.rpy:292
old "skip transitions"
new "ohita siirtymät"
# renpy/common/00preferences.rpy:294
old "video sprites"
new "video sprites"
# renpy/common/00preferences.rpy:303
old "show empty window"
# Automatic translation.
new "näytä tyhjä ikkuna"
# renpy/common/00preferences.rpy:312
old "text speed"
# Automatic translation.
new "tekstin nopeus"
# renpy/common/00preferences.rpy:320
old "joystick"
# Automatic translation.
new "Joystick"
# renpy/common/00preferences.rpy:320
old "joystick..."
new "joystick..."
# renpy/common/00preferences.rpy:327
old "skip"
# Automatic translation.
new "ohita"
# renpy/common/00preferences.rpy:330
old "skip unseen [text]"
new "ohita näkemätön [text]"
# renpy/common/00preferences.rpy:335
old "skip unseen text"
new "ohita näkemätön teksti"
# renpy/common/00preferences.rpy:337
old "begin skipping"
new "aloita ohittaminen"
# renpy/common/00preferences.rpy:341
old "after choices"
# Automatic translation.
new "valintojen jälkeen"
# renpy/common/00preferences.rpy:348
old "skip after choices"
new "ohita valintojen jälkeen"
# renpy/common/00preferences.rpy:350
old "auto-forward time"
new "automaattisen eteenpäinsiirtymisen aika"
# renpy/common/00preferences.rpy:364
old "auto-forward"
new "automaattinen eteenpäinsiirtyminen"
# renpy/common/00preferences.rpy:371
old "Auto forward"
new "Automaattinen eteenpäinsiirtyminen"
# renpy/common/00preferences.rpy:374
old "auto-forward after click"
new "automaattinen eteenpäinsiirtyminen napsautuksen jälkeen"
# renpy/common/00preferences.rpy:383
old "automatic move"
# Automatic translation.
new "automaattinen siirto"
# renpy/common/00preferences.rpy:392
old "wait for voice"
# Automatic translation.
new "odota ääntä"
# renpy/common/00preferences.rpy:401
old "voice sustain"
# Automatic translation.
new "äänen ylläpitäminen"
# renpy/common/00preferences.rpy:410
old "self voicing"
new "tietokoneen ääninäyttely"
# renpy/common/00preferences.rpy:419
old "self voicing volume drop"
new "tietokoneen ääninäyttelyn äänenvoimakkuuden pudotus"
# renpy/common/00preferences.rpy:427
old "clipboard voicing"
new "leikepöydän ääni"
# renpy/common/00preferences.rpy:436
old "debug voicing"
new "virheenkorjausääni"
# renpy/common/00preferences.rpy:445
old "emphasize audio"
new "korosta ääntä"
# renpy/common/00preferences.rpy:454
old "rollback side"
# Automatic translation.
new "Rollback-puoli"
# renpy/common/00preferences.rpy:464
old "gl powersave"
new "gl powersave"
# renpy/common/00preferences.rpy:470
old "gl framerate"
new "gl framerate"
# renpy/common/00preferences.rpy:473
old "gl tearing"
new "gl tearing"
# renpy/common/00preferences.rpy:476
old "font transform"
# Automatic translation.
new "fontin muunnos"
# renpy/common/00preferences.rpy:479
old "font size"
# Automatic translation.
new "fonttikoko"
# renpy/common/00preferences.rpy:487
old "font line spacing"
# Automatic translation.
new "fontin riviväli"
# renpy/common/00preferences.rpy:495
old "system cursor"
# Automatic translation.
new "järjestelmän kursori"
# renpy/common/00preferences.rpy:504
old "renderer menu"
# Automatic translation.
new "renderöintivalikko"
# renpy/common/00preferences.rpy:507
old "accessibility menu"
# Automatic translation.
new "saavutettavuusvalikko"
# renpy/common/00preferences.rpy:510
old "high contrast text"
# Automatic translation.
new "korkean kontrastin teksti"
# renpy/common/00preferences.rpy:519
old "audio when minimized"
# Automatic translation.
new "ääni kun se on minimoitu"
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
# Automatic translation.
new "ääni kun se ei ole keskittynyt"
# renpy/common/00preferences.rpy:537
old "web cache preload"
# Automatic translation.
new "verkkovälimuistin esilataus"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
# Automatic translation.
new "ääni pelivalikon jälkeen"
# renpy/common/00preferences.rpy:571
old "main volume"
new "pää-äänenvoimakkuus"
# renpy/common/00preferences.rpy:572
old "music volume"
new "musiikin äänenvoimakkuus"
# renpy/common/00preferences.rpy:573
old "sound volume"
new "tehosteiden äänenvoimakkuus"
# renpy/common/00preferences.rpy:574
old "voice volume"
new "ääninäyttelyn äänenvoimakkuus"
# renpy/common/00preferences.rpy:575
old "mute main"
new "mykistä pää-ääni"
# renpy/common/00preferences.rpy:576
old "mute music"
new "mykistä musiikki"
# renpy/common/00preferences.rpy:577
old "mute sound"
new "mykistä äänitehosteet"
# renpy/common/00preferences.rpy:578
old "mute voice"
new "mykistä ääninäyttely"
# renpy/common/00preferences.rpy:579
old "mute all"
new "mykistä kaikki"
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
# Automatic translation.
new "Puhekuplaeditori"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
# Automatic translation.
new "(piilota)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
# Automatic translation.
new "Synkronointi ladattu."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
# Automatic translation.
new "Yhteyttä Ren'Py Sync -palvelimeen ei saatu muodostettua."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
# Automatic translation.
new "Ren'Py Sync -palvelimen aikakatkaisu."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
# Automatic translation.
new "Ren'Py Sync -palvelimeen muodostettaessa yhteyttä tapahtui tuntematon virhe."
# renpy/common/00sync.rpy:267
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
# Automatic translation.
new "Ren'Py Sync -palvelimella ei ole kopiota tästä synkronoinnista. Synkronointitunnus voi olla virheellinen tai se voi olla vanhentunut."
# renpy/common/00sync.rpy:409
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
# Automatic translation.
new "Kirjoita luomasi synkronointitunnus.\nÄlä koskaan anna synkronointitunnusta, jota et ole luonut itse."
# renpy/common/00sync.rpy:428
old "The sync ID is not in the correct format."
# Automatic translation.
new "Synkronointitunnus ei ole oikeassa muodossa."
# renpy/common/00sync.rpy:448
old "The sync could not be decrypted."
# Automatic translation.
new "Synkronointia ei voitu purkaa."
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
# Automatic translation.
new "Synkronointi kuuluu eri peliin."
# renpy/common/00sync.rpy:476
old "The sync contains a file with an invalid name."
# Automatic translation.
new "Synkronointi sisältää tiedoston, jonka nimi on virheellinen."
# renpy/common/00sync.rpy:529
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
new "Tämä lataa tallennuksesi {a=https://sync.renpy.org}Ren'Py Sync Serveriin{/a}.\nHaluatko jatkaa?"
# renpy/common/00sync.rpy:558
old "Enter Sync ID"
# Automatic translation.
new "Syötä synkronointitunnus"
# renpy/common/00sync.rpy:569
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
new "Tämä ottaa yhteyttä {a=https://sync.renpy.org}Ren'Py Sync Serveriin{/a}."
# renpy/common/00sync.rpy:596
old "Sync Success"
new "Synkronointi onnistui"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
# Automatic translation.
new "Synkronointitunnus on:"
# renpy/common/00sync.rpy:605
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
new "Voit käyttää tätä tunnusta ladataksesi tallennuksesi toiseen laitteeseen.\nTämä synkronointi päättyy tunnin kuluttua.\nRen'Py Sync on {a=https://www.renpy.org/sponsors.html}Ren'Pyn sponsorien{/a} tukema."
# renpy/common/00sync.rpy:631
old "Sync Error"
# Automatic translation.
new "Synkronointivirhe"
+1 -109
View File
@@ -75,8 +75,7 @@ translate finnish strings:
# _developer/developer.rpym:532
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# Automatic translation.
new "\n{color=#cfc}✔ ennustettu kuva (hyvä){/color}\n{color=#fcc}✘ ennakoimaton kuva (huono){/color}\n{color=#fff}Siirrä vetämällä.{/color}"
new "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
@@ -178,110 +177,3 @@ translate finnish strings:
old "jump <label>: jumps to label"
new "jump <tunnus>: hyppää 'script.rpy'-tiedosto(i)ssa olevaan, tunnuksella merkittyyn kohtaan"
translate finnish strings:
# renpy/common/_developer/developer.rpym:43
old "Interactive Director (D)"
# Automatic translation.
new "Interaktiivinen johtaja (D)"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
# Automatic translation.
new "Pysyvä katseluohjelma"
# renpy/common/_developer/developer.rpym:59
old "Show Image Load Log (F4)"
# Automatic translation.
new "Näytä kuvan latausloki (F4)"
# renpy/common/_developer/developer.rpym:62
old "Hide Image Load Log (F4)"
# Automatic translation.
new "Piilota kuvan latausloki (F4)"
# renpy/common/_developer/developer.rpym:65
old "Image Attributes"
# Automatic translation.
new "Kuva-attribuutit"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
# Automatic translation.
new "Puhekuplaeditori (Shift+B)"
# renpy/common/_developer/developer.rpym:97
old "[name] [attributes] (hidden)"
# Automatic translation.
new "[name] [attributes] (piilotettu)"
# renpy/common/_developer/developer.rpym:101
old "[name] [attributes]"
new "[name] [attributes]"
# renpy/common/_developer/developer.rpym:162
old "Hide deleted"
# Automatic translation.
new "Piilota poistettu"
# renpy/common/_developer/developer.rpym:162
old "Show deleted"
# Automatic translation.
new "Näytä poistettu"
# renpy/common/_developer/developer.rpym:389
old "Type to filter: "
# Automatic translation.
new "Suodatettava tyyppi: "
# renpy/common/_developer/developer.rpym:507
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
# Automatic translation.
new "Tekstuurit: [tex_count] ([tex_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:511
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# Automatic translation.
new "Kuvien välimuisti: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
# Automatic translation.
new "help: näytä tämä apu\n help <expr>: näytä <expr>:n allekirjoitus ja dokumentaatio"
# renpy/common/00console.rpy:813
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
# Automatic translation.
new "Ohje saattaa näyttää dokumentoimattomia toimintoja. Tarkista, että toiminto tai\nluokkaa, jota haluat käyttää, on dokumentoitu.\n\n"
# renpy/common/00console.rpy:854
old "stack: print the return stack"
# Automatic translation.
new "stack: tulostaa paluupinon"
# renpy/common/00console.rpy:908
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
# Automatic translation.
new "watch <expression>: katsella python-lauseketta\n watch short: tekee jäljitettyjen lausekkeiden esityksestä lyhyen (oletusarvo)\n watch long: tekee jäljitettyjen ilmaisujen esittämisen sellaiseksi kuin se on."
# renpy/common/00console.rpy:1028
old "short: Shorten the representation of objects on the console (default)."
# Automatic translation.
new "short: Lyhentää objektien esitystä konsolissa (oletus)."
# renpy/common/00console.rpy:1032
old "long: Print the full representation of objects on the console."
# Automatic translation.
new "long: Tulostaa objektien täydellisen esityksen konsoliin."
# renpy/common/00console.rpy:1036
old "escape: Enables escaping of unicode symbols in unicode strings."
# Automatic translation.
new "escape: Mahdollistaa unicode-symbolien pakenemisen unicode-merkkijonoissa."
# renpy/common/00console.rpy:1040
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
# Automatic translation.
new "unescape: Poistaa unicode-merkkijonojen unicode-symbolien eskandoimisen ja tulostaa ne sellaisenaan (oletus)."
+1 -131
View File
@@ -79,7 +79,7 @@ translate finnish strings:
# 00gltest.rpy:200
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}Huomaa:{/b} Microsoftin DirectX-verkkoasennusohjelma asentaa, oletusarvoisesti, Bing-työkalupalkin. Jos et halua tätä työkalupalkkia, poista valinta oikeasta laatikosta."
new "{b}Huomaa:{/b} Microsoftin DirectX verkkoasennusohjelma asentaa, oletusarvoisesti, Bing-työkalupalkin. Jos et halua tätä työkalupalkkia, poista valinta oikeasta laatikosta."
# 00gltest.rpy:204
old "When setup finishes, please click below to restart this program."
@@ -177,133 +177,3 @@ translate finnish strings:
old "Copies the errors.txt file to the clipboard."
new "Kopioi errors.txt-tiedoston leikepöydälle."
translate finnish strings:
# renpy/common/00gltest.rpy:89
old "Renderer"
new "Renderer"
# renpy/common/00gltest.rpy:100
old "Force GL Renderer"
new "Force GL Renderer"
# renpy/common/00gltest.rpy:105
old "Force ANGLE Renderer"
new "Force ANGLE Renderer"
# renpy/common/00gltest.rpy:110
old "Force GLES Renderer"
# Automatic translation.
new "Pakota GLES Renderer"
# renpy/common/00gltest.rpy:116
old "Force GL2 Renderer"
# Automatic translation.
new "Pakota GL2 Renderer"
# renpy/common/00gltest.rpy:121
old "Force ANGLE2 Renderer"
# Automatic translation.
new "Voima ANGLE2 Renderer"
# renpy/common/00gltest.rpy:126
old "Force GLES2 Renderer"
# Automatic translation.
new "Pakota GLES2 Renderer"
# renpy/common/00gltest.rpy:136
old "Enable (No Blocklist)"
# Automatic translation.
new "Enable (Ei estolistaa)"
# renpy/common/00gltest.rpy:159
old "Powersave"
new "Powersave"
# renpy/common/00gltest.rpy:173
old "Framerate"
new "Framerate"
# renpy/common/00gltest.rpy:177
old "Screen"
# Automatic translation.
new "Näyttö"
# renpy/common/00gltest.rpy:181
old "60"
new "60"
# renpy/common/00gltest.rpy:185
old "30"
new "30"
# renpy/common/00gltest.rpy:191
old "Tearing"
new "Tearing"
# renpy/common/00gltest.rpy:249
old "This game requires use of GL2 that can't be initialised."
# Automatic translation.
new "Tämä peli vaatii GL2:n käyttöä, jota ei voida alustaa."
# renpy/common/00gltest.rpy:259
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
# Automatic translation.
new "{a=edit:1:log.txt}log.txt{/a} tiedosto voi sisältää tietoja, joiden avulla voit selvittää, mikä tietokoneessa on vikana."
# renpy/common/00gltest.rpy:264
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
# Automatic translation.
new "Lisätietoja tämän korjaamisesta löytyy {a=[url]}-dokumentaatiosta{/a}."
# renpy/common/00gltest.rpy:281
old "Change render options"
# Automatic translation.
new "Muuta renderöintivaihtoehtoja"
# renpy/common/00gamepad.rpy:58
old "Press or move the '[control!s]' [kind]."
# Automatic translation.
new "Paina tai siirrä '[control!s]' [kind]."
# renpy/common/_errorhandling.rpym:555
old "Open"
# Automatic translation.
new "Avaa"
# renpy/common/_errorhandling.rpym:559
old "Copy BBCode"
# Automatic translation.
new "Kopioi BBCode"
# renpy/common/_errorhandling.rpym:561
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
# Automatic translation.
new "Kopioi traceback.txt-tiedoston leikepöydälle BBkoodina foorumeille, kuten https://lemmasoft.renai.us/."
# renpy/common/_errorhandling.rpym:563
old "Copy Markdown"
# Automatic translation.
new "Kopioi Markdown"
# renpy/common/_errorhandling.rpym:565
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
# Automatic translation.
new "Kopioi traceback.txt-tiedoston leikepöydälle Markdown-muodossa Discordia varten."
# renpy/common/_errorhandling.rpym:626
old "Ignores the exception, allowing you to continue."
# Automatic translation.
new "Jättää poikkeuksen huomiotta, jolloin voit jatkaa."
# renpy/common/_errorhandling.rpym:637
old "Console"
# Automatic translation.
new "Konsoli"
# renpy/common/_errorhandling.rpym:639
old "Opens a console to allow debugging the problem."
# Automatic translation.
new "Avaa konsolin ongelman vianmääritystä varten."
+102 -170
View File
@@ -3,477 +3,409 @@ translate finnish strings:
# gui.rpy:2
old "## Initialization"
new "## Alustus"
new "## Initialization"
# gui.rpy:5
old "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## init offset-lause käskee ajamaan tämän tiedoston init-koodin ennen muiden tiedostojen init-koodia."
new "## The init offset statement causes the init code in this file to run before init code in any other file."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## gui.init-metodin kutsuminen nollaa tyylit järkeviin vakioasetuksiin, sekä asettaa peli-ikkunan leveyden ja korkeuden."
new "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
# gui.rpy:21
old "## Colors"
new "## Värit"
new "## Colors"
# gui.rpy:23
old "## The colors of text in the interface."
new "## Ikkunan tekstien väritys."
new "## The colors of text in the interface."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
new "## Korostusväri tekstin korostamista sekä merkkausta varten."
new "## An accent color used throughout the interface to label and highlight text."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
new "## Tekstipainikkeen käyttämä väri, kun se ei ole valittuna eikä kursori ole sen päällä."
new "## The color used for a text button when it is neither selected nor hovered."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## Pikkuväriä käytetään pienelle tekstille, jonka tulee olla kirkkaampi tai tummempi erottuakseen."
new "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
new "## Painikkeiden käyttämä väri, kun ne ovat valittuja tai kursori on niiden päällä."
new "## The color that is used for buttons and bars that are hovered."
# gui.rpy:39
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## Tekstipainikkeen käyttämä väri, kun se on valittuna mutta ei aktiivisessa ikkunassa."
new "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
new "## Tekstipainikkeen käyttämä väri, kun se ei ole valittavissa."
new "## The color used for a text button when it cannot be selected."
# gui.rpy:46
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## Värit, joita käytetään täyttämättömien palkkien osiin. Näitä ei käytetä suoraan, vaan ainoastaan palkkikuvatiedostojen generoinnissa."
new "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## Värit, joita käytetään dialogin ja valikoiden tekstissä."
new "## The colors used for dialogue and menu choice text."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fontit sekä fonttikoot"
new "## Fonts and Font Sizes"
# gui.rpy:58
old "## The font used for in-game text."
new "## Pelin sisäisen tekstin fontti."
new "## The font used for in-game text."
# gui.rpy:61
old "## The font used for character names."
new "## Hahmojen nimien fontti."
new "## The font used for character names."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## Pelin ulkoisen tekstin fontti."
new "## The font used for out-of-game text."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## Normaalin dialogitekstin fonttikoko."
new "## The size of normal dialogue text."
# gui.rpy:70
old "## The size of character names."
new "## Hahmojen nimien fonttikoko."
new "## The size of character names."
# gui.rpy:73
old "## The size of text in the game's user interface."
new "## Pelin käyttöliittymän tekstin koko."
new "## The size of text in the game's user interface."
# gui.rpy:76
old "## The size of labels in the game's user interface."
new "## Pelin käyttöliittymän otsikoiden koko."
new "## The size of labels in the game's user interface."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## Tekstin koko ilmoitusikkunassa."
new "## The size of text on the notify screen."
# gui.rpy:82
old "## The size of the game's title."
new "## Pelin nimen fonttikoko."
new "## The size of the game's title."
# gui.rpy:86
old "## Main and Game Menus"
new "## Pää- ja pelivalikot"
new "## Main and Game Menus"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## Pää- ja pelivalikoiden käyttämät kuvat."
new "## The images used for the main and game menus."
# gui.rpy:92
old "## Should we show the name and version of the game?"
new "## Tulisiko meidän näyttää pelin nimi ja versio?"
new "## Should we show the name and version of the game?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogi"
new "## Dialogue"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## Nämä muuttujat ohjaavat dialogin tulostusta näytölle rivi kerrallaan."
new "## These variables control how dialogue is displayed on the screen one line at a time."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## Dialogi-ikkunan korkeus."
new "## The height of the textbox containing dialogue."
# gui.rpy:104
old "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
new "## Dialogi-ikkunan sijainti pystytasossa näytöllä. 0.0 on ikkunan yläreuna, 0.5 keskikohta, ja 1.0 alareuna."
new "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
# gui.rpy:109
old "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
new "## Puhuvan hahmon nimen sijainti suhteeessa dialogi-ikkunan sijaintiin. Arvot voivat olla pikseleiden määrä kokonaislukuina, tai 0.5 keskikohtana."
new "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
# gui.rpy:114
old "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
new "## Hahmon nimen sijainti vaakatasossa. Arvo voi olla 0.0 vasemmalle reunalle, 0.5 keskitetylle, tai 1.0 oikealle reunalle."
new "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# gui.rpy:118
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## Hahmon nimen sisältävän laatikon leveys, korkeus, ja reunan paksuus. Arvo None päättää koon automaattisesti."
new "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
# gui.rpy:123
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## Hahmon nimilaatikon reunat, järjestyksessä vasen, ylä, oikea, ja alaosa."
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Arvon ollessa True, nimilaatikon tausta käyttää itseään toistavaa taustakuvaa. Arvon ollessa False, taustakuvan koko skaalautuu."
new "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
# gui.rpy:132
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
new "## Dialogin sijainti suhteessa dialogi-ikkunaan. Arvot voivat olla pikseleiden määrä kokonaislukuina, tai 0.5 keskikohtana."
new "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## Dialogitekstin maksimileveys pikseleinä."
new "## The maximum width of dialogue text, in pixels."
# gui.rpy:141
old "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
new "## Dialogin sijainti vaakatasossa. Arvo voi olla 0.0 vasemmalle reunalle, 0.5 keskitetylle, tai 1.0 oikealle reunalle."
new "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# gui.rpy:146
old "## Buttons"
new "## Painikkeet"
new "## Buttons"
# gui.rpy:148
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## Nämä muuttujat, gui/button-kansiossa olevien kuvatiedostojen ohella, ohjaavat painikkeiden ulkoasua."
new "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
# gui.rpy:151
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## Painikkeen leveys ja korkeus, pikseleinä. Arvon ollessa None, Ren'Py laskee sopivan koon."
new "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
# gui.rpy:155
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## Reunat painikkeen jokaisella sivulla, järjestyksessä vasen, ylä, oikea, ja alareuna."
new "## The borders on each side of the button, in left, top, right, bottom order."
# gui.rpy:158
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## Arvon ollessa True, painikkeen tausta käyttää itseään toistavaa taustakuvaa. Arvon ollessa False, taustakuvan koko skaalautuu lineaarisesti."
new "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
# gui.rpy:162
old "## The font used by the button."
new "## Painikkeen käyttämä fontti."
new "## The font used by the button."
# gui.rpy:165
old "## The size of the text used by the button."
new "## Painikkeen käyttämä fonttikoko."
new "## The size of the text used by the button."
# gui.rpy:179
old "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
new "## Nämä muuttujat yliajavat erilaisten painikkeiden oletusasetuksia. Luethan lisätietoa erilaisista painikkeista sekä niiden käyttötarkoituksista GUI-dokumentaatiosta."
new "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## Nämä muokkaukset ovat käytössä oletuskäyttöliittymässä:"
new "## These customizations are used by the default interface:"
# gui.rpy:198
old "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
new "## Voit myös halutessasi lisätä omia muokkauksiasi lisäämällä oikein nimettyjä muuttujia. Voit esimerkiksi ottaa seuraavan rivin pois kommentista asettaaksesi valikkopainikkeen leveyden."
new "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
# gui.rpy:205
old "## Choice Buttons"
new "## Valikon Painikkeet"
new "## Choice Buttons"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Nämä muuttujat määrittävät pelin sisäisten valikoiden painikkeiden ominaisuuksia."
new "## Choice buttons are used in the in-game menus."
# gui.rpy:220
old "## File Slot Buttons"
new "## Tallennuspaikan Painikkeet"
new "## File Slot Buttons"
# gui.rpy:222
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
new "## Tallennuspaikan painike on erityispainike, joka sisältää esikatselukuvan ja tekstiselitteen tallennuspaikan sisällöstä. Tallennuspaikka käyttää kuvatiedostoja gui/button-kansiosta, kuten muutkin painikkeet."
new "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
# gui.rpy:226
old "## The save slot button."
new "## Tallennuspaikan painike."
new "## The save slot button."
# gui.rpy:234
old "## The width and height of thumbnails used by the save slots."
new "## Tallennuspaikan käyttämien esikatselukuvien leveys ja korkeus."
new "## The width and height of thumbnails used by the save slots."
# gui.rpy:238
old "## The number of columns and rows in the grid of save slots."
new "## Tallennuspaikkojen ruudukon rivien ja sarakkeiden lukumäärä."
new "## The number of columns and rows in the grid of save slots."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Sijainti ja Välit"
new "## Positioning and Spacing"
# gui.rpy:245
old "## These variables control the positioning and spacing of various user interface elements."
new "## Nämä muuttujat säätelevät erilaisten käyttöliittymän komponenttien sijaintia ja väljäyttä."
new "## These variables control the positioning and spacing of various user interface elements."
# gui.rpy:248
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## Siirtymäpainikkeiden vasemman puolen sijainti suhteessa ikkunan vasempaan reunaan."
new "## The position of the left side of the navigation buttons, relative to the left side of the screen."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## Sivuutusilmaisimen sijainti pystyakselilla."
new "## The vertical position of the skip indicator."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## Ilmoitusnäytön sijainti pystyakselilla."
new "## The vertical position of the notify screen."
# gui.rpy:258
old "## The spacing between menu choices."
new "## Valikon vaihtoehtojen välinen tila."
new "## The spacing between menu choices."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
new "## Painikkeiden välinen tila pää- ja pelivalikoissa."
new "## Buttons in the navigation section of the main and game menus."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Hallitsee asetusten välistä etäisyyttä."
new "## Controls the amount of spacing between preferences."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Hallitsee asetusten painikkeiden välisiä etäisyyksiä."
new "## Controls the amount of spacing between preference buttons."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## Tyhjä tila tallennussivun painikkeiden välillä."
new "## The spacing between file page buttons."
# gui.rpy:273
old "## The spacing between file slots."
new "## Tyhjä tila tallennuspaikkojen välillä."
new "## The spacing between file slots."
# gui.rpy:277
old "## Frames"
new "## Reunat"
new "## Frames"
# gui.rpy:279
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## Nämä muuttujaat säätelevät käyttöliittymän komponentteja ympäröivien reunojen ominaisuuksia, kun varsinaista ikkunaa ei ole."
new "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Geneeriset reunat, joita koodi voi luoda."
new "## Generic frames that are introduced by player code."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
new "## Varmistusikkunan käyttämä reuna."
new "## The frame that is used as part of the confirm screen."
# gui.rpy:288
old "## The frame that is used as part of the skip screen."
new "## Sivuutusikkunan käyttämä reuna."
new "## The frame that is used as part of the skip screen."
# gui.rpy:291
old "## The frame that is used as part of the notify screen."
new "## Ilmoitusikkunan käyttämä reuna."
new "## The frame that is used as part of the notify screen."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Tulisiko kehyksen taustakuvan toistaa itseään?"
new "## Should frame backgrounds be tiled?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Palkit, Vierityspalkit, ja Liukuvalinnat"
new "## Bars, Scrollbars, and Sliders"
# gui.rpy:300
old "## These control the look and size of bars, scrollbars, and sliders."
new "## Nämä muokkaavat palkkien, vierityspalkkien, ja liukuvalintojen ulkonäköä sekä kokoa."
new "## These control the look and size of bars, scrollbars, and sliders."
# gui.rpy:302
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
new "## Oletusarvoinen graafinen käyttöliittymä käyttää vain liukuvalintoja sekä pystysuoria vierityspalkkeja. Kaikkia muita käytetään vain jos projektin koodi niitä erikseen käyttää."
new "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
# gui.rpy:305
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Palkkien, vierityspalkkien, ja liukuvalintojen korkeus ja leveys."
new "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
# gui.rpy:311
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## Arvon ollessa True, palkit käyttävät itseään toistavia taustakuvia. Arvon ollessa False, taustakuvan koko skaalautuu lineaarisesti."
new "## True if bar images should be tiled. False if they should be linearly scaled."
# gui.rpy:316
old "## Horizontal borders."
new "## Vaakatason reunat."
new "## Horizontal borders."
# gui.rpy:321
old "## Vertical borders."
new "## Pystysuorat reunat."
new "## Vertical borders."
# gui.rpy:326
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## Päättää, näkyvätkö tyngät vierityspalkit. \"hide\" piilottaa ne, None pitää ne näkyvillä."
new "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
# gui.rpy:331
old "## History"
new "## Historia"
new "## History"
# gui.rpy:333
old "## The history screen displays dialogue that the player has already dismissed."
new "## Historia-ikkuna näyttää dialogin, jonka pelaaja on jo lukenut."
new "## The history screen displays dialogue that the player has already dismissed."
# gui.rpy:335
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## Määrittää, montako dialogitekstiä Ren'Py pitää muistissaan."
new "## The number of blocks of dialogue history Ren'Py will keep."
# gui.rpy:338
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## Historia-näytön yksittäisen dialogin korkeus, tai None jolloin korkeus vaihtelee, lisäten prosessorin rasitusta."
new "## The height of a history screen entry, or None to make the height variable at the cost of performance."
# gui.rpy:342
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Puhuvan hahmon nimen sijainti, leveys, ja ryhmäytys."
new "## The position, width, and alignment of the label giving the name of the speaking character."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## Dialogitekstin sijainti, leveys, ja ryhmäytys."
new "## The position, width, and alignment of the dialogue text."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Tila"
new "## NVL-Mode"
# gui.rpy:358
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## NVL-tilan näyttö näyttää NVL-tilan hahmojen dialogin."
new "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
# gui.rpy:360
old "## The borders of the background of the NVL-mode background window."
new "## NVL-tilan ikkunan taustan reunat."
new "## The borders of the background of the NVL-mode background window."
# gui.rpy:363
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## NVL-tilan dialogin korkeus. Asetettaessa arvoon None, korkeus säätyy automaattisesti."
new "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
# gui.rpy:367
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## Väli NVL-tilan dialogien sekä NVL-tilan valikon välillä, kun gui.nvl_height on None."
new "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
# gui.rpy:384
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## nvl_thought-tekstin sijainti, leveys, ja ryhmäytys (nvl_narrator-hahmon puhuma teksti.)"
new "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## NVL-valikon painikkeiden sijainti."
new "## The position of nvl menu_buttons."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## Kasvattaa pikavalikon painikkeiden kokoa mobiililaitteilla, tehden niistä helpompia käyttää."
new "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# gui.rpy:409
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## Muuttaa useiden käyttöliittymän elementtien kokoa ja välejä, tehden niistä helpommin erottuvia matkapuhelimilla."
new "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
# gui.rpy:413
old "## Font sizes."
new "## Fonttikoot."
new "## Font sizes."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Säädä teksti-ikkunan sijaintia."
new "## Adjust the location of the textbox."
# gui.rpy:427
old "## Change the size and spacing of items in the game menu."
new "## Mukauta pelivalikon elementtien kokoa ja sijaintia."
new "## Change the size and spacing of items in the game menu."
# gui.rpy:436
old "## File button layout."
new "## Tallennusvalikon painikkeen asettelu."
new "## File button layout."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-tila."
new "## NVL-mode."
# gui.rpy:456
old "## Quick buttons."
new "## Pikavalikko."
translate finnish strings:
# gui/game/gui.rpy:5
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
# Automatic translation.
new "## Init offset -lauseke saa aikaan sen, että tässä tiedostossa olevat alustamislausekkeet suoritetaan ennen minkä tahansa muun tiedoston init-lausekkeita."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
# Automatic translation.
new "## Ota käyttöön virheellisten tai epävakaiden ominaisuuksien tarkistukset näytöissä tai muunnoksissa."
# gui/game/gui.rpy:19
old "## GUI Configuration Variables"
# Automatic translation.
new "## GUI-konfiguraatiomuuttujat"
# gui/game/gui.rpy:167
old "## The color of button text in various states."
# Automatic translation.
new "## Painikkeen tekstin väri eri tiloissa."
# gui/game/gui.rpy:173
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
# Automatic translation.
new "## Painikkeen tekstin vaakasuora kohdistus. (0.0 on vasen, 0.5 on keskellä, 1.0 on oikea)."
# gui/game/gui.rpy:278
old "## The position of the main menu text."
# Automatic translation.
new "## Päävalikon tekstin sijainti."
# gui/game/gui.rpy:287
old "## Generic frames."
# Automatic translation.
new "## Yleiset kehykset."
# gui/game/gui.rpy:307
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
# Automatic translation.
new "## Oletusarvoinen graafinen käyttöliittymä käyttää vain liukusäätimiä ja pystysuuntaisia vierityspalkkeja. Kaikkia muita palkkeja käytetään vain luojan kirjoittamissa näytöissä."
# gui/game/gui.rpy:368
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
# Automatic translation.
new "## NVL-tilan merkintöjen enimmäismäärä, jonka Ren'Py näyttää. Kun näytetään tätä enemmän merkintöjä, vanhin merkintä poistetaan."
# gui/game/gui.rpy:405
old "## Localization"
# Automatic translation.
new "## Lokalisointi"
# gui/game/gui.rpy:407
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# Automatic translation.
new "## Tämä säätää, missä kohtaa rivinvaihto sallitaan. Oletusarvo sopii useimmille kielille. Luettelo käytettävissä olevista arvoista löytyy osoitteesta https://www.renpy.org/doc/html/style_properties.html#style-property-language."
# gui/game/gui.rpy:415
old "## Mobile devices"
# Automatic translation.
new "## Mobiililaitteet"
# gui/game/gui.rpy:446
old "## Change the size and spacing of various things."
# Automatic translation.
new "## Muuta eri asioiden kokoa ja välejä."
new "## Quick buttons."
File diff suppressed because it is too large Load Diff
+45 -73
View File
@@ -3,119 +3,119 @@ translate finnish strings:
# options.rpy:1
old "## This file contains options that can be changed to customize your game."
new "## Tämä tiedosto sisältää asetuksia, joita muokkaamalla voit mukauttaa peliäsi."
new "## This file contains options that can be changed to customize your game."
# options.rpy:4
old "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
new "## Rivit, jotka alkavat kahdells '#'-merkillä, ovat kommentteja eikä sinun tule muuttaa niitä ohjelmakoodiksi. Rivit, jotka alkavat yhdellä '#'-merkillä, ovat kommentoitua koodia, ja voit halutessasi palauttaa ne ohjelmakoodiksi."
new "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
# options.rpy:10
old "## Basics"
new "## Perusteet"
new "## Basics"
# options.rpy:12
old "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
new "## Ihmisille luettava pelin nimi. Tätä käytetään peli-ikkunan nimen asetuksessa, ja se näkyy pelin ikkunassa sekä virheraporteissa."
new "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
# options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## _() merkkijonon ympärillä merkitsee sen soveltuvaksi käännöksille."
new "## The _() surrounding the string marks it as eligible for translation."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 Oletusarvoinen GUI"
new "Ren'Py 7 Default GUI"
# options.rpy:20
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
new "## Päättää, näytetäänkö ylläannettu nimi pelin päävalikossa. Aseta arvoksi False piilottaaksesi nimen."
new "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
# options.rpy:26
old "## The version of the game."
new "## Pelin versio."
new "## The version of the game."
# options.rpy:31
old "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
new "## Teksti, joka näkyy pelin tietoja-ikkunassa. Lisätäksesi tyhjän rivin lauseiden väliin, kirjoita \\n\\n."
new "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
# options.rpy:37
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## Lyhyt nimi pelille, jota käytetään kootuille ohjelmatiedostoille sekä kansioille. Nimen on oltava pelkkiä ASCII-merkkejä, eikä se saa sisältää välilyöntejä, pisteitä, eikä puolipisteitä."
new "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
# options.rpy:44
old "## Sounds and music"
new "## Äänet ja musiikki"
new "## Sounds and music"
# options.rpy:46
old "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
new "## Nämä kolme muuttujaa ohjaavat, mitkä mikserit näytetään pelaajalle oletusarvoisesti. Asettamalla arvoksi False piilottaa kyseisen mikserin."
new "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
# options.rpy:55
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
new "## Mahdollistaaksesi käyttäjän soittaa testiääni äänitehoste- tai puhekanavilla, palauta seuraava kommentti takaisin ohjelmakoodiksi ja käytä sitä valitaksesi sopivan testiäänen."
new "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
# options.rpy:62
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
new "## Palauta seuraava rivi takaisin ohjelmakoodiksi valitaksesi äänitiedoston, jota soitetaan pelaajan ollessa päävalikossa. Tämän tiedoston toisto jatkuu pelin alkaessa, kunnes se pysäytetään tai toinen tiedosto alkaa soimaan."
new "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
# options.rpy:69
old "## Transitions"
new "## Siirtymät"
new "## Transitions"
# options.rpy:71
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
new "## Nämä muuttujat asettavat erilaisia siirtymiä eri tapahhtumien kohdalla. Jokainen muuttuja tulee asettaa johonkin siirtymään, tai None mikäli siirtymää ei haluta käyttää."
new "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
# options.rpy:75
old "## Entering or exiting the game menu."
new "## Pelivalikon avaaminen ja sulkeminen."
new "## Entering or exiting the game menu."
# options.rpy:81
old "## A transition that is used after a game has been loaded."
new "## Siirtymä, jota käytetään kun peli on ladattu."
new "## A transition that is used after a game has been loaded."
# options.rpy:86
old "## Used when entering the main menu after the game has ended."
new "## Käytetään siirryttäessä päävalikkoon pelin päätyttyä."
new "## Used when entering the main menu after the game has ended."
# options.rpy:91
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
new "## Muuttujaa siirtymän valitsemiseksi pelin alkaessa ei ole olemassa. Sen sijaan, käytä with-väitettä näytettyäsi ensimmäisen kohtauksen."
new "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
# options.rpy:96
old "## Window management"
new "## Ikkunanhallinta"
new "## Window management"
# options.rpy:98
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
new "## Tämä muokkaa dialogi-ikkunan näkyvyyttä. Arvon ollessa \"show\", ikkuna on aina näkyvissä. Mikäli se on \"hide\", ikkuna näkyy vain kun on dialogia mitä näyttää. Ja jos se on \"auto\", ikkuna ei ole näkyvissä ennen scene-lauseita ja näytetään kun dialogia on näytettävänä."
new "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
# options.rpy:103
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## Pelin alettua, tätä voidaan muuttaa \"window show\", \"window hide\", ja \"window auto\" -lauseilla."
new "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
# options.rpy:109
old "## Transitions used to show and hide the dialogue window"
new "## Siirtymät, joita käytetään dialogi-ikkunan näytössä ja piilotuksessa"
new "## Transitions used to show and hide the dialogue window"
# options.rpy:115
old "## Preference defaults"
new "## Asetusten oletusarvot"
new "## Preference defaults"
# options.rpy:117
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Asettaa tekstin näytön oletusnopeuden. Oletusarvo, 0, on ääretön (teksti näkyy välittömästi), kaikki muut positiiviset luvut asettavat näytettyjen merkkien lukumäärän sekunnissa."
new "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
# options.rpy:123
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## Oletusarvoinen automaattisen jatkamisen viive. Suuremmat luvut johtavatt pidempiin viiveisiin, tuetut arvot ovat väliltä 0-30."
new "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
# options.rpy:129
old "## Save directory"
new "## Tallennuskansio"
new "## Save directory"
# options.rpy:131
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
new "## Asettaa alustariippuvaisen sijainnin, johon Ren'Py tallentaa pelitallennukset. Tallennustiedostot tallennetaan kansioon:"
new "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
# options.rpy:134
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
@@ -131,93 +131,65 @@ translate finnish strings:
# options.rpy:140
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
new "## Tätä ei yleensä kannata muuttaa, ja jos muutetaan, sen tulee aina olla merkkijonoliteraali eikä ekspressio."
new "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
# options.rpy:146
old "## Icon ########################################################################'"
new "## Ikoni #######################################################################'"
new "## Icon ########################################################################'"
# options.rpy:148
old "## The icon displayed on the taskbar or dock."
new "## Tehtäväpalkissa tai työpöydällä näkyvä ikoni."
new "## The icon displayed on the taskbar or dock."
# options.rpy:153
old "## Build configuration"
new "## Jakeluasetukset"
new "## Build configuration"
# options.rpy:155
old "## This section controls how Ren'Py turns your project into distribution files."
new "## Tämä osio ohjaa Ren'Py:n käyttäytymistä pelin jakeluiden kokoamisvaiheessa."
new "## This section controls how Ren'Py turns your project into distribution files."
# options.rpy:160
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## Seuraavat funktiot vaativat tiedostonimimallin. Mallit ovat kirjasinkokoriippumattomia, ja niitä verrataan projektikansiosta riippuvaisina, joko alkavan /-merkin kanssa tai ilman. Jos useampi malli täsmää, käytetään ensimmäistä sopivaa."
new "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
# options.rpy:165
old "## In a pattern:"
new "## Mallin syntaksi:"
new "## In a pattern:"
# options.rpy:167
old "## / is the directory separator."
new "## / on kansioiden erotin."
new "## / is the directory separator."
# options.rpy:169
old "## * matches all characters, except the directory separator."
new "## * täsmää kaikkiin merkkeihin, paitsi kansion erottimeen."
new "## * matches all characters, except the directory separator."
# options.rpy:171
old "## ** matches all characters, including the directory separator."
new "## ** täsmää kaikkiin merkkeihin, mukaan lukien kansion erottimeen."
new "## ** matches all characters, including the directory separator."
# options.rpy:173
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## Esimerkiksi, \"*.txt\" täsmää kaikkiin txt-tiedostoihin projektikansiossa, \"game/**.ogg\" täsmää kaikkiin ogg-tiedostoihin game-kansiossa tai sen alakansioissa, ja \"**.psd\" täsmää kaikkiin, missä tahansa projektissa sijaitseviin psd-tiedostoihin."
new "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
# options.rpy:177
old "## Classify files as None to exclude them from the built distributions."
new "## Luokittele tiedostot arvolla None jättääksesi ne pois kootuista jakeluista."
new "## Classify files as None to exclude them from the built distributions."
# options.rpy:185
old "## To archive files, classify them as 'archive'."
new "## Arkistoidaksesi tiedostoja, luokittele ne arvolla 'archive'."
new "## To archive files, classify them as 'archive'."
# options.rpy:190
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
new "## Dokumentaatiotiedostot kloonautuvat mac-sovelluksissa, joten ne sisältyvät sekä sovelluksessa että zip-tiedostossa."
new "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
# options.rpy:196
old "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
new "## Google Play -lisenssiavain vaaditaan jotta lisäosatiedostoja ja sovelluksen sisäisiä ostoja voidaan tukea. Sen voi löytää \"Services & APIs\"-sivulta Google Play -kehittäjäkonsolista."
new "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## Kauttaviivan erottama käyttäjänimi ja itch.io-projektinimi."
translate finnish strings:
# gui/game/options.rpy:31
old "## Text that is placed on the game's about screen. Place the text between the triple-quotes, and leave a blank line between paragraphs."
# Automatic translation.
new "## Teksti, joka sijoitetaan pelin about-näyttöön. Sijoita teksti kolmoislauseiden väliin ja jätä kappaleiden väliin tyhjä rivi."
# gui/game/options.rpy:47
old "## These three variables control, among other things, which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
# Automatic translation.
new "## Nämä kolme muuttujaa säätelevät muun muassa sitä, mitkä mikserit näytetään pelaajalle oletusarvoisesti. Jonkin näistä muuttujista asettaminen Falseen piilottaa kyseisen mikserin."
# gui/game/options.rpy:82
old "## Between screens of the game menu."
# Automatic translation.
new "## Pelivalikon näyttöjen välillä."
# gui/game/options.rpy:152
old "## Icon"
# Automatic translation.
new "## Kuvake"
# gui/game/options.rpy:203
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
# Automatic translation.
new "## Google Play -lisenssiavain tarvitaan sovelluksen sisäisten ostojen tekemiseen. Se löytyy Google Play -kehittäjäkonsolista kohdasta \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
new "## The username and project name associated with an itch.io project, separated by a slash."
+128 -261
View File
@@ -3,23 +3,23 @@ translate finnish strings:
# screens.rpy:9
old "## Styles"
new "## Tyylit"
new "## Styles"
# screens.rpy:87
old "## In-game screens"
new "## Pelinsisäiset näytöt"
new "## In-game screens"
# screens.rpy:91
old "## Say screen"
new "## Tulostenäyttö"
new "## Say screen"
# screens.rpy:93
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## Tulostenäyttöä käytetään dialogin näyttämiseen pelaajalle. Se ottaa kaksi parametriä, who ja what, jotka ovat puhuvan hahmon nimi sekä näytettävä teksti. (who-parametri voi olla None, jos nimeä ei anneta.)"
new "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
# screens.rpy:98
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
new "## Tämän näytön on luotava tekstiesittäjä käyttäen komentoa id \"what\", sillä Ren'Py käyttää tätä tekstin näytön käsittelyssä. Se voi myös luoda grafiikkaa käyttäen komentoja id \"who\" ja id \"window\" tyyliominaisuuksien lisäämiseksi."
new "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
# screens.rpy:102
old "## https://www.renpy.org/doc/html/screen_special.html#say"
@@ -27,15 +27,15 @@ translate finnish strings:
# screens.rpy:169
old "## Input screen"
new "## Syötenäyttö"
new "## Input screen"
# screens.rpy:171
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## Tätä näyttöä käytetään renpy.input:in renderöinnissä. prompt-parametri antaa kehotetekstin."
new "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
# screens.rpy:174
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## Tämän näytön tulee luoda syöttöikkuna käyttäen komentoa id \"input\" voidakseen hyväksyä erilaisia syöteparametrejä."
new "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
# screens.rpy:177
old "## http://www.renpy.org/doc/html/screen_special.html#input"
@@ -43,11 +43,11 @@ translate finnish strings:
# screens.rpy:205
old "## Choice screen"
new "## Valintanäyttö"
new "## Choice screen"
# screens.rpy:207
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
new "## Tätä näyttöä käytetään esittämään pelinsisäiset menu-lauseen esittämät valinnat. Sen ainoa parametri, items, on lista olioista, joiista jokaisessa on kentät otsikolle ja toiminnolle."
new "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
# screens.rpy:211
old "## http://www.renpy.org/doc/html/screen_special.html#choice"
@@ -55,15 +55,15 @@ translate finnish strings:
# screens.rpy:221
old "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
new "## Tämän ollessa tosi, kertoja puhuu valinnat ääneen. Ja kun epätosi, vaihtoehdot näytetään tyhjinä painikkeina."
new "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
# screens.rpy:244
old "## Quick Menu screen"
new "## Pikavalikkonäyttö"
new "## Quick Menu screen"
# screens.rpy:246
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## Pikavalikko näytetään pelin aikana, tarjoten helpon pääsyn pelin ulkoisiin valikkoihin."
new "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
# screens.rpy:261
old "Back"
@@ -71,12 +71,11 @@ translate finnish strings:
# screens.rpy:262
old "History"
new "Historia"
new "History"
# screens.rpy:263
old "Skip"
# Automatic translation.
new "Ohita"
new "Skip"
# screens.rpy:264
old "Auto"
@@ -84,51 +83,51 @@ translate finnish strings:
# screens.rpy:265
old "Save"
new "Tallenna"
new "Save"
# screens.rpy:266
old "Q.Save"
new "P.Tallenna"
new "Q.Save"
# screens.rpy:267
old "Q.Load"
new "P.Lataa"
new "Q.Load"
# screens.rpy:268
old "Prefs"
new "Asetukset"
new "Prefs"
# screens.rpy:271
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
new "## Tämä koodi varmistaa, että quick_menu-näyttö näytetään pelin aikana, aina kun pelaaja ei ole erikseen sitä piilottanut."
new "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
# screens.rpy:291
old "## Navigation screen"
new "## Siirtymänäyttö"
new "## Navigation screen"
# screens.rpy:293
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
new "## Tämä näyttö sisältyy pää- ja pelivalikkoon, tarjoten pääsyn muihin valikoihin, sekä pelin aloitukseen."
new "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
# screens.rpy:308
old "Start"
new "Aloita"
new "Start"
# screens.rpy:316
old "Load"
new "Lataa"
new "Load"
# screens.rpy:318
old "Preferences"
new "Asetukset"
new "Preferences"
# screens.rpy:322
old "End Replay"
new "Päätä Toisto"
new "End Replay"
# screens.rpy:326
old "Main Menu"
new "Päävalikko"
new "Main Menu"
# screens.rpy:328
old "About"
@@ -136,15 +135,15 @@ translate finnish strings:
# screens.rpy:332
old "## Help isn't necessary or relevant to mobile devices."
new "## Ohje ei ole tarpeellinen tai oleellinen mobiililaitteilla."
new "## Help isn't necessary or relevant to mobile devices."
# screens.rpy:333
old "Help"
new "Ohje"
new "Help"
# screens.rpy:335
old "## The quit button is banned on iOS and unnecessary on Android."
new "## Poistu-painike on kielletty iOS-laitteilla, ja tarpeeton Android-laitteilla."
new "## The quit button is banned on iOS and unnecessary on Android."
# screens.rpy:336
old "Quit"
@@ -152,11 +151,11 @@ translate finnish strings:
# screens.rpy:350
old "## Main Menu screen"
new "## Päävalikkonäkymä"
new "## Main Menu screen"
# screens.rpy:352
old "## Used to display the main menu when Ren'Py starts."
new "## Käytetään päävalikon näyttämiseksi Ren'Py:n käynnistyessä."
new "## Used to display the main menu when Ren'Py starts."
# screens.rpy:354
old "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
@@ -164,19 +163,19 @@ translate finnish strings:
# screens.rpy:369
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## use-komento sisältää toisen näytön. Päävalikon sisältö on todellisuudessa osa siirtymänäyttöä."
new "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
# screens.rpy:413
old "## Game Menu screen"
new "## Pelivalikkonäkymä"
new "## Game Menu screen"
# screens.rpy:415
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
new "## Tämä esittää pelivalikon perusrakenteen. Sitä kutsutaan näytön nimellä, ja se näyttää taustakuvan, nimen, sekä siirtymävalinnat."
new "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
# screens.rpy:418
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## scroll-parametri voi olla None, tai vaihtoisesti \"viewport\" tai \"vpgrid\". Tämän näytön sisältäessä yhden tai useamman muun näytön, jotka sijoitetaan sen sisään."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# screens.rpy:476
old "Return"
@@ -184,43 +183,43 @@ translate finnish strings:
# screens.rpy:539
old "## About screen"
new "## Tietoja-näyttö"
new "## About screen"
# screens.rpy:541
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## Tämä näyttö antaa kehuja kehittäjille, sekä kopio-oikeusinformaatiota pelistä sekä Ren'Py:stä."
new "## This screen gives credit and copyright information about the game and Ren'Py."
# screens.rpy:544
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
new "## Tässä näytössä ei ole mitään erityistä, minkä vuoksi se toimii hyvin esimerkkinä itse tehdystä näytöstä."
new "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
# screens.rpy:551
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
new "## Tämä use-lause sisältää game_menu-näytön. Sen alainen vbox-ikkuna sisältyy täten näkymään game_menu-näytön kautta."
new "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
# screens.rpy:561
old "Version [config.version!t]\n"
new "Versio [config.version!t]\n"
new "Version [config.version!t]\n"
# screens.rpy:563
old "## gui.about is usually set in options.rpy."
new "## gui.about asetetaan yleensä tiedostossa options.rpy."
new "## gui.about is usually set in options.rpy."
# screens.rpy:567
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Kehitetty käyttäen ohjelmaa {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# screens.rpy:570
old "## This is redefined in options.rpy to add text to the about screen."
new "## Tämä on määritelty uudelleen options.rpy-tiedostossa tekstin lisäämiseksi tietoja-näyttöön."
new "## This is redefined in options.rpy to add text to the about screen."
# screens.rpy:582
old "## Load and Save screens"
new "## Lataa ja Tallenna -näytöt"
new "## Load and Save screens"
# screens.rpy:584
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
new "## Nämä näytöt mahdollistavat pelaajan tallentaa pelin edistys ja ladata olemassaolevia tallennuksia. Koska näillä on niin paljon yhteistä, molemmat näytöt on määritelty kolmannen näytön, file_slots, mukaan."
new "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
# screens.rpy:588
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
@@ -240,11 +239,11 @@ translate finnish strings:
# screens.rpy:613
old "## This ensures the input will get the enter event before any of the buttons do."
new "## Tämä varmistaa, että input saa enter-tapahtuman ennen muita painikkeita."
new "## This ensures the input will get the enter event before any of the buttons do."
# screens.rpy:629
old "## The grid of file slots."
new "## Tallennuspaikkojen taulukko."
new "## The grid of file slots."
# screens.rpy:649
old "{#file_time}%A, %B %d %Y, %H:%M"
@@ -252,11 +251,11 @@ translate finnish strings:
# screens.rpy:649
old "empty slot"
new "tyhjä paikka"
new "empty slot"
# screens.rpy:657
old "## Buttons to access other pages."
new "## Painikkeita muille sivuille pääsyä varten."
new "## Buttons to access other pages."
# screens.rpy:666
old "<"
@@ -276,11 +275,11 @@ translate finnish strings:
# screens.rpy:711
old "## Preferences screen"
new "## Asetukset-näyttö"
new "## Preferences screen"
# screens.rpy:713
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## Asetukset antavat pelaajan säätää pelin grafiikka, toiminnot sekä äänet mieleisekseen."
new "## The preferences screen allows the player to configure the game to better suit themselves."
# screens.rpy:716
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
@@ -300,7 +299,7 @@ translate finnish strings:
# screens.rpy:744
old "Rollback Side"
new "Palautussivu"
new "Rollback Side"
# screens.rpy:745
old "Disable"
@@ -308,63 +307,63 @@ translate finnish strings:
# screens.rpy:746
old "Left"
new "Vasen"
new "Left"
# screens.rpy:747
old "Right"
new "Oikea"
new "Right"
# screens.rpy:752
old "Unseen Text"
new "Lukematon Teksti"
new "Unseen Text"
# screens.rpy:753
old "After Choices"
new "Päätösten Jälkeen"
new "After Choices"
# screens.rpy:754
old "Transitions"
new "Siirtymät"
new "Transitions"
# screens.rpy:756
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Ylimääräisiä tyyppien \"radio_pref\" tai \"check_pref\" vboxeja voidaan lisätä tähän, antaen pelaajalle ylimääräisiä kehittäjän luomia asetuksia."
new "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
# screens.rpy:767
old "Text Speed"
new "Tekstin Nopeus"
new "Text Speed"
# screens.rpy:771
old "Auto-Forward Time"
new "Automaattisen Jatkamisen Viive"
new "Auto-Forward Time"
# screens.rpy:778
old "Music Volume"
new "Musiikin Äänenvoimakkuus"
new "Music Volume"
# screens.rpy:785
old "Sound Volume"
new "Ääniefektien Äänenvoimakkuus"
new "Äänenvoimakkuus"
# screens.rpy:791
old "Test"
new "Kokeile"
new "Test"
# screens.rpy:795
old "Voice Volume"
new "Puheen Äänenvoimakkuus"
new "Voice Volume"
# screens.rpy:806
old "Mute All"
new "Mykistä Kaikki"
new "Mute All"
# screens.rpy:882
old "## History screen"
new "## Historia-näyttö"
new "## History screen"
# screens.rpy:884
old "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
new "## Tämä näyttö näyttää dialogihistorian pelaajalle. Vaikka kyseisessä näytössä ei ole mitään erityistä, sillä on pääsy _history_list:iin tallennettuun dialogihistoriaan."
new "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
# screens.rpy:888
old "## https://www.renpy.org/doc/html/history.html"
@@ -372,35 +371,35 @@ translate finnish strings:
# screens.rpy:894
old "## Avoid predicting this screen, as it can be very large."
new "## Vältä ennustamasta tätä näyttöä, sillä se voi olla hyvin suuri."
new "## Avoid predicting this screen, as it can be very large."
# screens.rpy:905
old "## This lays things out properly if history_height is None."
new "## Tämä asettelee dialogin kunnnolla, jos history_height on None."
new "## This lays things out properly if history_height is None."
# screens.rpy:914
old "## Take the color of the who text from the Character, if set."
new "## Ota väri hahmon who-tekstistä, jos asetettu."
new "## Take the color of the who text from the Character, if set."
# screens.rpy:921
old "The dialogue history is empty."
new "Dialogihistoria on tyhjä."
new "The dialogue history is empty."
# screens.rpy:965
old "## Help screen"
new "## Ohje-näyttö"
new "## Help screen"
# screens.rpy:967
old "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
new "## Näyttö, joka tarjoaa tietoa pelin käyttämistä hiiren ja näppäimistön painikkeista sekä niiden toiminnoista. Se käyttää muita näyttöjä (keyboard_help, mouse_help, ja gamepad_help) näyttääkseen itse ohjeet."
new "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
# screens.rpy:986
old "Keyboard"
new "Näppäimistö"
new "Keyboard"
# screens.rpy:987
old "Mouse"
new "Hiiri"
new "Mouse"
# screens.rpy:990
old "Gamepad"
@@ -408,36 +407,35 @@ translate finnish strings:
# screens.rpy:1003
old "Enter"
# Automatic translation.
new "Kirjoita"
new "Enter"
# screens.rpy:1004
old "Advances dialogue and activates the interface."
new "Jatkaa dialogia ja aktivoi valittuja toimintoja."
new "Advances dialogue and activates the interface."
# screens.rpy:1007
old "Space"
new "Välilyönti"
new "Space"
# screens.rpy:1008
old "Advances dialogue without selecting choices."
new "Jatkaa dialogia tekemättä päätöksiä."
new "Advances dialogue without selecting choices."
# screens.rpy:1011
old "Arrow Keys"
new "Nuolinäppäimet"
new "Arrow Keys"
# screens.rpy:1012
old "Navigate the interface."
new "Liiku käyttöliittymässä."
new "Navigate the interface."
# screens.rpy:1015
old "Escape"
new "Esc"
new "Escape"
# screens.rpy:1016
old "Accesses the game menu."
new "Avaa ja sulkee pelivalikon."
new "Accesses the game menu."
# screens.rpy:1019
old "Ctrl"
@@ -445,100 +443,99 @@ translate finnish strings:
# screens.rpy:1020
old "Skips dialogue while held down."
new "Sivuuttaa dialogin pidettäessä painettuna."
new "Skips dialogue while held down."
# screens.rpy:1023
old "Tab"
new "Sarkain"
new "Tab"
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Asettaa dialogin sivuutuksen päälle ja pois."
new "Toggles dialogue skipping."
# screens.rpy:1027
old "Page Up"
# Automatic translation.
new "Sivu ylös"
new "Page Up"
# screens.rpy:1028
old "Rolls back to earlier dialogue."
new "Siirtyy takaisin aiempaan dialogiin."
new "Rolls back to earlier dialogue."
# screens.rpy:1031
old "Page Down"
new "Siirtyy uudempaan dialogiin."
new "Page Down"
# screens.rpy:1032
old "Rolls forward to later dialogue."
new "Vierittää kohti uudempaa dialogia."
new "Rolls forward to later dialogue."
# screens.rpy:1036
old "Hides the user interface."
new "Piilottaa käyttöliittymän."
new "Hides the user interface."
# screens.rpy:1040
old "Takes a screenshot."
new "Ottaa näytönkaappauksen."
new "Takes a screenshot."
# screens.rpy:1044
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Asettaa auttavan {a=https://www.renpy.org/l/voicing}TTS-tilan{/a} päälle ja pois."
new "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
# screens.rpy:1050
old "Left Click"
new "Hiiren Vasen Painike"
new "Left Click"
# screens.rpy:1054
old "Middle Click"
new "Hiiren Keskipainike"
new "Middle Click"
# screens.rpy:1058
old "Right Click"
new "Hiiren Oikea Painike"
new "Right Click"
# screens.rpy:1062
old "Mouse Wheel Up"
new "Hiiren Rulla Ylös"
old "Mouse Wheel Up\nClick Rollback Side"
new "Mouse Wheel Up\nClick Rollback Side"
# screens.rpy:1066
old "Mouse Wheel Down"
new "Hiiren Rulla Alas"
new "Mouse Wheel Down"
# screens.rpy:1073
old "Right Trigger\nA/Bottom Button"
new "Oikea Liipaisin\nA/Alapainike"
new "Right Trigger\nA/Bottom Button"
# screens.rpy:1074
old "Advance dialogue and activates the interface."
new "Jatka dialogia ja aktivoi valittuja toimintoja."
new "Advance dialogue and activates the interface."
# screens.rpy:1078
old "Roll back to earlier dialogue."
new "Siirtyy takaisin aiempaan dialogiin."
new "Roll back to earlier dialogue."
# screens.rpy:1081
old "Right Shoulder"
new "Oikea Olkapainike"
new "Right Shoulder"
# screens.rpy:1082
old "Roll forward to later dialogue."
new "Vieritä kohti uudempaa dialogia."
new "Roll forward to later dialogue."
# screens.rpy:1085
old "D-Pad, Sticks"
new "Ristiohjain, Tikut"
new "D-Pad, Sticks"
# screens.rpy:1089
old "Start, Guide"
new "Start, Opas"
new "Start, Guide"
# screens.rpy:1090
old "Access the game menu."
new "Avaa ja sulje pelivalikko."
new "Access the game menu."
# screens.rpy:1093
old "Y/Top Button"
new "Y/Yläpainike"
new "Y/Top Button"
# screens.rpy:1096
old "Calibrate"
@@ -546,15 +543,15 @@ translate finnish strings:
# screens.rpy:1124
old "## Additional screens"
new "## Ylimääräisiä näyttöjä"
new "## Additional screens"
# screens.rpy:1128
old "## Confirm screen"
new "## Vahvistusikkuna"
new "## Confirm screen"
# screens.rpy:1130
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## Vahvistusikkunaa käytetään, kun Ren'Py haluaa kysyä pelaajalta kyllä tai ei -kysymyksen."
new "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
# screens.rpy:1133
old "## http://www.renpy.org/doc/html/screen_special.html#confirm"
@@ -562,7 +559,7 @@ translate finnish strings:
# screens.rpy:1137
old "## Ensure other screens do not get input while this screen is displayed."
new "## Varmista, etteivät muut näytöt odota syötettä tämän näytön ollessa näkyvillä."
new "## Ensure other screens do not get input while this screen is displayed."
# screens.rpy:1161
old "Yes"
@@ -574,15 +571,15 @@ translate finnish strings:
# screens.rpy:1164
old "## Right-click and escape answer \"no\"."
new "## Hiiren oikea painike ja Esc antavat vastauksen \"ei\"."
new "## Right-click and escape answer \"no\"."
# screens.rpy:1191
old "## Skip indicator screen"
new "## Sivuutusilmaisin-näyttö"
new "## Skip indicator screen"
# screens.rpy:1193
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## skip_indicator-näyttö on näkyvillä, kun dialogin sivuutuksen tila on käytössä."
new "## The skip_indicator screen is displayed to indicate that skipping is in progress."
# screens.rpy:1196
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
@@ -590,19 +587,19 @@ translate finnish strings:
# screens.rpy:1208
old "Skipping"
new "Sivuutetaan dialogia"
new "Skipping"
# screens.rpy:1215
old "## This transform is used to blink the arrows one after another."
new "## Tätä muutosta käytetään nuolten vilkkumiseen toistensa perään."
new "## This transform is used to blink the arrows one after another."
# screens.rpy:1247
old "## Notify screen"
new "## Ilmoitusnäyttö"
new "## Notify screen"
# screens.rpy:1249
old "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
new "## Ilmoitusnäyttöä käytetään näyttämään pelaajalle viesti. (Esimerkiksi kun peli on pikatallennettu tai näytönkaappaus on otettu.)"
new "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
# screens.rpy:1252
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
@@ -610,11 +607,11 @@ translate finnish strings:
# screens.rpy:1286
old "## NVL screen"
new "## NVL-näyttö"
new "## NVL screen"
# screens.rpy:1288
old "## This screen is used for NVL-mode dialogue and menus."
new "## Tätä näyttöä käytetään NVL-tilan dialogiin ja valikoihin."
new "## This screen is used for NVL-mode dialogue and menus."
# screens.rpy:1290
old "## http://www.renpy.org/doc/html/screen_special.html#nvl"
@@ -622,155 +619,25 @@ translate finnish strings:
# screens.rpy:1301
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Näyttää dialogin joko vpgridissä tai vboxissa."
new "## Displays dialogue in either a vpgrid or the vbox."
# screens.rpy:1314
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
new "## Näyttää valikon, jos annettu. Valikko voi näyttää väärältä mikäli config.narrator_menu on asetettu arvoon True, kuten yllä."
new "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
# screens.rpy:1344
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## Tämä säätää, kuinka mointa NVL-tilan viestiä voidaan maksimissaan näyttää kerralla."
new "## This controls the maximum number of NVL-mode entries that can be displayed at once."
# screens.rpy:1406
old "## Mobile Variants"
new "## Mobiiliversiot"
new "## Mobile Variants"
# screens.rpy:1413
old "## Since a mouse may not be present, we replace the quick menu with a version that uses fewer and bigger buttons that are easier to touch."
new "## Koska hiirtä ei välttämättä ole, korvaamme pikavalikon versiolla jossa on vähemmän, ja suurempia painikkeita, joita on helpompi koskea."
new "## Since a mouse may not be present, we replace the quick menu with a version that uses fewer and bigger buttons that are easier to touch."
# screens.rpy:1429
old "Menu"
new "Valikko"
translate finnish strings:
# gui/game/screens.rpy:114
old "## If there's a side image, display it above the text. Do not display on the phone variant - there's no room."
# Automatic translation.
new "## Jos sivulla on kuva, näytä se tekstin yläpuolella. Älä näytä puhelinmuunnoksessa - siinä ei ole tilaa."
# gui/game/screens.rpy:120
old "## Make the namebox available for styling through the Character object."
# Automatic translation.
new "## Tee nimilaatikosta muotoiltavissa oleva Character-olio."
# gui/game/screens.rpy:173
old "## https://www.renpy.org/doc/html/screen_special.html#input"
new "## https://www.renpy.org/doc/html/screen_special.html#input"
# gui/game/screens.rpy:206
old "## https://www.renpy.org/doc/html/screen_special.html#choice"
new "## https://www.renpy.org/doc/html/screen_special.html#choice"
# gui/game/screens.rpy:241
old "## Ensure this appears on top of other screens."
# Automatic translation.
new "## Varmista, että tämä näkyy muiden näyttöjen yläpuolella."
# gui/game/screens.rpy:280
old "## Main and Game Menu Screens"
# Automatic translation.
new "## Pää- ja pelivalikon näytöt"
# gui/game/screens.rpy:329
old "## The quit button is banned on iOS and unnecessary on Android and Web."
# Automatic translation.
new "## Lopeta-painike on kielletty iOS:ssä ja tarpeeton Androidissa ja Webissä."
# gui/game/screens.rpy:348
old "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
new "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
# gui/game/screens.rpy:352
old "## This ensures that any other menu screen is replaced."
# Automatic translation.
new "## Näin varmistetaan, että kaikki muut valikkonäytöt korvataan."
# gui/game/screens.rpy:357
old "## This empty frame darkens the main menu."
# Automatic translation.
new "## Tämä tyhjä kehys tummentaa päävalikon."
# gui/game/screens.rpy:429
old "## Reserve space for the navigation section."
# Automatic translation.
new "## Varaa tilaa navigointiosuudelle."
# gui/game/screens.rpy:608
old "## The page name, which can be edited by clicking on a button."
# Automatic translation.
new "## Sivun nimi, jota voidaan muokata napsauttamalla painiketta."
# gui/game/screens.rpy:668
old "## range(1, 10) gives the numbers from 1 to 9."
# Automatic translation.
new "## range(1, 10) antaa numerot 1-9."
# gui/game/screens.rpy:676
old "Upload Sync"
# Automatic translation.
new "Lataa synkronointi"
# gui/game/screens.rpy:680
old "Download Sync"
# Automatic translation.
new "Lataa Sync"
# gui/game/screens.rpy:921
old "## This determines what tags are allowed to be displayed on the history screen."
# Automatic translation.
new "## Tämä määrittää, mitä tunnisteita saa näyttää historiaruudulla."
# gui/game/screens.rpy:1049
old "Opens the accessibility menu."
# Automatic translation.
new "Avaa saavutettavuusvalikon."
# gui/game/screens.rpy:1082
old "Left Trigger\nLeft Shoulder"
# Automatic translation.
new "Vasen liipaisin\nVasen olkapää"
# gui/game/screens.rpy:1139
old "## https://www.renpy.org/doc/html/screen_special.html#confirm"
new "## https://www.renpy.org/doc/html/screen_special.html#confirm"
# gui/game/screens.rpy:1248
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
# Automatic translation.
new "## Meidän on käytettävä fonttia, jossa on BLACK RIGHT-POINTING SMALL TRIANGLE -lyhenne."
# gui/game/screens.rpy:1296
old "## https://www.renpy.org/doc/html/screen_special.html#nvl"
new "## https://www.renpy.org/doc/html/screen_special.html#nvl"
# gui/game/screens.rpy:1320
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
# Automatic translation.
new "## Näyttää valikon, jos se on annettu. Valikko saatetaan näyttää virheellisesti, jos config.narrator_menu on asetettu arvoon True."
# gui/game/screens.rpy:1410
old "## Bubble screen"
# Automatic translation.
new "## Kupla näyttö"
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
# Automatic translation.
new "## Puhekuplaikkunaa käytetään näyttämään dialogi pelaajalle, kun käytetään puhekuplia. Bubble screen ottaa samat parametrit kuin say screen, sen on luotava displayable, jonka id on \"what\", ja se voi luoda displayables, joiden id:t ovat \"namebox\", \"who\" ja \"window\"."
# gui/game/screens.rpy:1417
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
new "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
translate finnish strings:
# gui/game/screens.rpy:411
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# Automatic translation.
new "## Selausparametri voi olla None tai jokin seuraavista: \"viewport\" tai \"vpgrid\". Tämä ruutu on tarkoitettu käytettäväksi yhden tai useamman lapsen kanssa, jotka siirretään (sijoitetaan) sen sisään."
new "Menu"
+12 -135
View File
@@ -332,6 +332,8 @@
old "return"
new "retour"
translate french strings:
# renpy/common/00accessibility.rpy:76
old "Font Override"
new "Forcer la police"
@@ -390,7 +392,7 @@
# renpy/common/00accessibility.rpy:34
old "viewport"
new "fenêtre déroulante"
new "viewport"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
@@ -426,11 +428,11 @@
# renpy/common/00action_file.rpy:353
old "Save slot %s: [text]"
new "Sauvegarder %s : [text]"
new "Sauvegarder %s: [text]"
# renpy/common/00action_file.rpy:434
old "Load slot %s: [text]"
new "Charger %s : [text]"
new "Charger %s: [text]"
# renpy/common/00action_file.rpy:487
old "Delete slot [text]"
@@ -486,7 +488,7 @@
# renpy/common/00director.rpy:1561
old "(statement)"
new "(instruction)"
new "(statement)"
# renpy/common/00director.rpy:1562
old "(tag)"
@@ -506,8 +508,7 @@
# renpy/common/00director.rpy:1601
old "(channel)"
# Automatic translation.
new "(canal)"
new "(channel)"
# renpy/common/00director.rpy:1602
old "(filename)"
@@ -527,7 +528,7 @@
# renpy/common/00director.rpy:1674
old "Statement:"
new "Instruction :"
new "Statement :"
# renpy/common/00director.rpy:1695
old "Tag:"
@@ -543,7 +544,7 @@
# renpy/common/00director.rpy:1748
old "Behind:"
new "Derrière :"
new "Sous :"
# renpy/common/00director.rpy:1767
old "Transition:"
@@ -551,7 +552,7 @@
# renpy/common/00director.rpy:1785
old "Channel:"
new "Piste :"
new "Channel :"
# renpy/common/00director.rpy:1803
old "Audio Filename:"
@@ -731,7 +732,7 @@
# renpy/common/_developer/developer.rpym:57
old "Show Image Load Log (F4)"
new "Afficher le log de chargement des images (F4)"
new "Montrer le log ne chargement des images (F4)"
# renpy/common/_developer/developer.rpym:60
old "Hide Image Load Log (F4)"
@@ -759,7 +760,7 @@
# renpy/common/_developer/developer.rpym:506
old "Type to filter: "
new "Écrire pour filtrer : "
new "Type à filtrer : "
# renpy/common/_developer/developer.rpym:631
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
@@ -784,127 +785,3 @@
# renpy/common/00preferences.rpy:493
old "high contrast text"
new "texte en contraste élevé"
# renpy/common/00preferences.rpy:511
old "audio when minimized"
new "audio quand minimisé"
# renpy/common/00preferences.rpy:531
old "main volume"
new "volume principal"
# renpy/common/00preferences.rpy:535
old "mute main"
new "sourdine générale"
# renpy/common/00speechbubble.rpy:299
old "Speech Bubble Editor"
new "Éditeur de bulles de dialogue"
# renpy/common/00speechbubble.rpy:304
old "(hide)"
new "(masquer)"
# renpy/common/00director.rpy:1748
old "Click to toggle attribute, right click to toggle negative attribute."
new "Clic pour (dés)activer des attributs, clic droit pour (dés)activer les suppressions d'attributs."
# renpy/common/00director.rpy:1771
old "Click to set transform, right click to add to transform list."
new "Clic pour assigner le transform, clic droit pour ajouter à la liste des transforms."
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
new "Clic pour assigner, clic droit pour ajouter à la liste du \"behind\"."
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
new "audio lors de la perte de focus"
# renpy/common/00preferences.rpy:537
old "web cache preload"
new "préchargement du cache web cache"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
new "voix dans le menu de jeu"
# renpy/common/00sync.rpy:58
old "Sync downloaded."
new "Sync téléchargé."
# renpy/common/00sync.rpy:178
old "Could not connect to the Ren'Py Sync server."
new "Échec de la connexion au serveur Ren'Py Sync."
# renpy/common/00sync.rpy:180
old "The Ren'Py Sync server timed out."
new "Le serveur Ren'Py Sync a mis trop de temps à répondre."
# renpy/common/00sync.rpy:182
old "An unknown error occurred while connecting to the Ren'Py Sync server."
new "Une erreur inconnue est arrivée lors de la connexion au serveur Ren'Py Sync."
# renpy/common/00sync.rpy:255
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
new "Le serveur Ren'Py Sync ne reconnaît pas ce code sync. l'ID est peut-être invalide, ou il peut avoir expiré."
# renpy/common/00sync.rpy:397
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
new "Entrez l'ID sync que vous avez généré.\nN'entrez jamais un ID sync que vous n'avez pas généré vous-même."
# renpy/common/00sync.rpy:416
old "The sync ID is not in the correct format."
new "L'ID sync n'est pas dans un format correct."
# renpy/common/00sync.rpy:436
old "The sync could not be decrypted."
new "Le sync n'a pas pu être déchiffré."
# renpy/common/00sync.rpy:459
old "The sync belongs to a different game."
new "Le sync correspond à un autre jeu."
# renpy/common/00sync.rpy:464
old "The sync contains a file with an invalid name."
new "Le sync contient un fichier ayant un nom invalide."
# renpy/common/00sync.rpy:517
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
new "Vos sauvegardes vont être téléchargées sur le {a=https://sync.renpy.org}serveur Ren'Py Sync{/a}.\nVoulez-vous continuer ?"
# renpy/common/00sync.rpy:546
old "Enter Sync ID"
new "Entrez l'ID Sync"
# renpy/common/00sync.rpy:557
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
new "Ceci va contacter le {a=https://sync.renpy.org}serveur Ren'Py Sync{/a}."
# renpy/common/00sync.rpy:584
old "Sync Success"
new "Sync réussi"
# renpy/common/00sync.rpy:587
old "The Sync ID is:"
new "L'ID Sync est :"
# renpy/common/00sync.rpy:593
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
new "Vous pouvez utiliser cet ID pour transférer votre sauvegarde sur un autre appareil.\nCe sync expirera dans une heure.\nRen'Py Sync is soutenu par les {a=https://www.renpy.org/sponsors.html}Sponsors de Ren'Py's{/a}."
# renpy/common/00sync.rpy:619
old "Sync Error"
new "Erreur de Sync"
# renpy/common/00webvideo.rpy:5
old "Touch to play the video."
new "Touchez pour jouer la vidéo."
# renpy/common/00gui.rpy:456
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
new "Cette sauvegarde a été créée sur un autre appareil. Des faux fichiers de sauvegarde peuvent être utilisés pour endommager votre ordinateur. Faites-vous confiance au créateur de cette sauvegarde et à tous ceux qui auraient pu modifier le fichier ?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
new "Faites-vous confiance à l'appareil sur lequel cette sauvegarde a été créée ? Vous ne devriez dire oui que si vous en êtes l'unique utilisateur ."
+17 -33
View File
@@ -14,11 +14,7 @@
# _developer/developer.rpym:47
old "Variable Viewer"
new "Inspecteur de variables"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "Inspecteur de données persistentes"
new "Visualisateur de variable"
# _developer/developer.rpym:49
old "Theme Test"
@@ -46,15 +42,15 @@
# _developer/developer.rpym:217
old "Return to the developer menu"
new "Retourner au menu de développeur"
new "Retourner au menu du développeur"
# _developer/developer.rpym:373
old "Rectangle: %r"
new "Rectangle : %r"
new "Rectangle: %r"
# _developer/developer.rpym:378
old "Mouse position: %r"
new "Position de la souris : %r"
new "Mouse position: %r"
# _developer/developer.rpym:383
old "Right-click or escape to quit."
@@ -78,11 +74,11 @@
# _developer/developer.rpym:532
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
new "\n{color=#cfc}✔ image prédite (bien){/color}\n{color=#fcc}✘ image non prédite (pas bien){/color}\n{color=#fff}Glissez pour déplacer.{/color}"
new "\n{color=#cfc}✔ image prédite (bon){/color}\n{color=#fcc}✘ image prédite (mauvais){/color}\n{color=#fff}Glissez pour bouger.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
new "Inspecteur de displayables"
new "Inspecteur affichable"
# _developer/inspector.rpym:61
old "Size"
@@ -102,11 +98,11 @@
# _developer/inspector.rpym:139
old "displayable:"
new "displayable :"
new "affichable :"
# _developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (Aucune propriété ne s'applique au displayable)"
new " (Aucune propriété naffecte laffichage)"
# _developer/inspector.rpym:147
old " (default properties omitted)"
@@ -118,7 +114,7 @@
# 00console.rpy:182
old "Press <esc> to exit console. Type help for help.\n"
new "Appuyez sur Échap pour quitter la console. Écrivez help pour afficher laide.\n"
new "Pressez « Echap » pour quitter la console. Pressez « Aide » pour afficher laide.\n"
# 00console.rpy:186
old "Ren'Py script enabled."
@@ -128,13 +124,9 @@
old "Ren'Py script disabled."
new "Script Ren'Py désactivé."
# renpy/common/00console.rpy:781
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
new "help : afficher cette aide\n help <expr>: afficher la signature et la documentation de <expr>"
# renpy/common/00console.rpy:805
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
new "Help peut afficher des fonctions non documentées. Veuillez vérifier que la\nfonction ou classe que vous voulez utiliser est bien documentée.\n\n"
# 00console.rpy:398
old "help: show this help"
new "aide: Afficher cette aide"
# 00console.rpy:403
old "commands:\n"
@@ -142,15 +134,15 @@
# 00console.rpy:413
old " <renpy script statement>: run the statement\n"
new " <renpy script statement> : exécuter cette déclaration\n"
new " <renpy script statement> : Exécuter cette déclaration\n"
# 00console.rpy:415
old " <python expression or statement>: run the expression or statement"
new " <expression ou instruction python> : exécuter cette expression ou cette instruction"
new " <python expression or statement> : Exécuter cette expression ou cette déclaration"
# 00console.rpy:423
old "clear: clear the console history"
new "clear : effacer lhistorique de la console"
new "clear: Purger lhistorique de la console"
# 00console.rpy:427
old "exit: exit the console"
@@ -166,7 +158,7 @@
# 00console.rpy:459
old "reload: reloads the game, refreshing the scripts"
new "reload : recharge le jeu, rafraîchit les scripts"
new "reload : Recharge le jeu, rafraîchit les scripts"
# 00console.rpy:467
old "watch <expression>: watch a python expression"
@@ -186,7 +178,7 @@
# renpy/common/00console.rpy:814
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
new "watch <expression> : surveille une expression python\n watch short : raccourcit la représentation des expressions (par défaut)\n watch long : affiche la totalité des expressions surveillées"
new "watch <expression> : surveille une expression python\n watch short: raccourcit la représentation des expressions (par défaut)\n watch long : affiche la totalité des expressions surveillées"
# renpy/common/00console.rpy:917
old "short: Shorten the representation of objects on the console (default)."
@@ -203,11 +195,3 @@
# renpy/common/00console.rpy:929
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
new "unescape : Désactive l'échappage des symboles unicode dans les chaînes de caractères unicode et les affiche telles quelles (par défaut)."
# renpy/common/00console.rpy:784
old "stack: print the return stack"
new "stack : affiche la pile de retour"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Éditeur de bulles de dialogue (Shift+B)"
+1 -1
View File
@@ -46,7 +46,7 @@
# 00gltest.rpy:152
old "This computer has a problem displaying graphics: [problem]."
new "Cet ordinateur rencontre un problème pour afficher les graphismes : [problem]."
new "Cet ordinateur rencontre un problème pour afficher les graphismes: [problem]."
# 00gltest.rpy:157
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
-4
View File
@@ -455,7 +455,3 @@
# gui/game/gui.rpy:441
old "## Change the size and spacing of various things."
new "## Changer la taille et l'espacement de diverses choses."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Active la vérification de propriétés invalides ou instables dans les screens et transforms"
+44 -340
View File
@@ -1,7 +1,4 @@
translate french strings:
# game/new_project.rpy:77
old "{#language name and font}"
new "{font=fonts/Roboto-Light.ttf}Français{/font}"
# about.rpy:39
old "[version!q]"
@@ -41,7 +38,7 @@
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
new "RAPT a été installé, mais vous devez installer le kit de développement Android pour pouvoir compiler les paquets Android, avec « Installer le SDK »."
new "RAPT a été installé, mais vous devez installer le kit de développement Android pour pouvoir compiler les paquets Android. Choisissez « installer le kit de développement et créer les clés » pour cela."
# android.rpy:33
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
@@ -65,11 +62,11 @@
# android.rpy:39
old "Attempts to emulate a televison-based Android console, like the OUYA or Fire TV.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "Tentative d’émulation d'une console télé basée sur Android, comme OUYA ou Fire TV.\n\nLa manette est émulée par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
new "Tentative d’émulation d'une console télé basée sur Android, comme OUYA ou Fire TV.\n\n Le contrôleur est émulé par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
# android.rpy:41
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "Télécharge et installe le kit de développement Android et les paquets requis. Optionnellement, génère les clés requises pour signer le paquet."
new "Télécharge et installe le kit de développement Android et les paquets supportés. Optionnellement, génère les clés requises pour signer le paquet."
# android.rpy:42
old "Configures the package name, version, and other information about this project."
@@ -109,7 +106,7 @@
# android.rpy:304
old "Android: [project.current.name!q]"
new "Android : [project.current.name!q]"
new "Android: [project.current.name!q]"
# android.rpy:324
old "Emulation:"
@@ -209,8 +206,7 @@
# choose_theme.rpy:370
old "Planetarium"
# Automatic translation.
new "Planétarium"
new "Planetarium"
# choose_theme.rpy:425
old "Choose Theme"
@@ -310,7 +306,7 @@
# distribute_gui.rpy:194
old "Add from clauses to calls, once"
new "Ajouter des \"from\" aux \"call\""
new "Add from clauses to calls, once"
# distribute_gui.rpy:195
old "Refresh"
@@ -318,7 +314,7 @@
# distribute_gui.rpy:199
old "Upload to itch.io"
new "Uploader sur itch.io"
new "Télécharger (upload) sur itch.io"
# distribute_gui.rpy:215
old "Build Packages:"
@@ -334,7 +330,7 @@
# distribute_gui.rpy:241
old "Add from clauses to calls"
new "Ajouter des \"from\" aux \"call\""
new "Add from clauses to calls"
# distribute_gui.rpy:242
old "Force Recompile"
@@ -346,7 +342,7 @@
# distribute_gui.rpy:250
old "Adding from clauses to call statements that do not have them."
new "Ajout de \"from\" aux \"call\" qui n'en ont pas."
new "Adding from clauses to call statements that do not have them."
# distribute_gui.rpy:271
old "Errors were detected when running the project. Please ensure the project runs without errors before building distributions."
@@ -414,7 +410,7 @@
# front_page.rpy:93
old "refresh"
new "rafraîchir"
new "rafraichir"
# front_page.rpy:120
old "+ Create New Project"
@@ -474,7 +470,7 @@
# front_page.rpy:223
old "Navigate Script"
new "Parcourir le script"
new "Naviguer dans le script"
# front_page.rpy:234
old "Check Script (Lint)"
@@ -565,8 +561,8 @@
new "Le projet [project_name!q] existe déjà. Choisissez un nom de projet différent."
# gui7.rpy:341
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of [default_size[0]]x[default_size[1]] is a reasonable compromise."
new "Quelle résolution souhaitez-vous utiliser pour votre projet ? Même si RenPy peut agrandir ou diminuer les fenêtres et leurs images à l’échelle, il sagit là de l’échelle initiale, la taille à laquelle les composants doivent être dessinés et la taille de fenêtre pour lesquelles ils seront le plus précis.\n\nThe La valeur par défaut ([default_size[0]]x[default_size[1]]) semble être un compromis raisonnable."
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."
new "Quelle résolution souhaitez-vous utiliser pour votre projet ? Même si RenPy peut agrandir ou diminuer les fenêtres et leurs images à l’échelle, il sagit là de l’échelle initiale, la taille à laquelle les composants doivent être dessinés et la taille de fenêtre pour lesquelles ils seront le plus précis.\n\nThe La valeur par défaut (1280x720) semble être un compromis raisonnable."
# gui7.rpy:389
old "Creating the new project..."
@@ -658,11 +654,11 @@
# ios.rpy:33
old "Attempts to emulate an iPhone.\n\nTouch input is emulated through the mouse, but only when the button is held down."
new "Tentative d'émuler un iPhone.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
new "Tentatives pour émuler un iPhone.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
# ios.rpy:34
old "Attempts to emulate an iPad.\n\nTouch input is emulated through the mouse, but only when the button is held down."
new "Tentative d'émuler un iPad.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
new "Tentatives pour émuler un iPad.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
# ios.rpy:36
old "Selects the directory where Xcode projects will be placed."
@@ -690,7 +686,7 @@
# ios.rpy:211
old "iOS: [project.current.name!q]"
new "iOS : [project.current.name!q]"
new "iOS: [project.current.name!q]"
# ios.rpy:240
old "iPhone"
@@ -746,7 +742,7 @@
# itch.rpy:99
old "The butler program was not found."
new "Le programme butler n'a pas été trouvé."
new "Le programme coordonnateur(butler) n'a pas été trouvé."
# itch.rpy:99
old "Please install the itch.io app, which includes butler, and try again."
@@ -890,7 +886,7 @@
# preferences.rpy:111
old "Text Editor:"
new "Éditeur de texte :"
new "Éditeur :"
# preferences.rpy:117
old "Text editor: [text]"
@@ -898,7 +894,7 @@
# preferences.rpy:133
old "Update Channel:"
new "Type de version :"
new "Version"
# preferences.rpy:153
old "Navigation Options:"
@@ -926,7 +922,7 @@
# preferences.rpy:174
old "Show edit file section"
new "Afficher la section d’édition de fichiers"
new "Afficher la section d’édition de fichier"
# preferences.rpy:175
old "Large fonts"
@@ -934,11 +930,11 @@
# preferences.rpy:178
old "Console output"
new "Console de sortie"
new "Sortie console"
# preferences.rpy:199
old "Open launcher project"
new "Ouvrir le projet du lanceur"
new "Ouvrir le projet lanceur"
# preferences.rpy:213
old "Language:"
@@ -998,7 +994,7 @@
# translations.rpy:104
old "The language to work with. This should only contain lower-case ASCII characters and underscores."
new "Le langage avec lequel travailler. Cette valeur ne doit contenir que des caractères ASCII en minuscules et des underscores."
new "Le langage avec lequel travailler. Cette valeur ne doit contenir que des caractères ASCII en minuscules et des underscores (tiret bas)."
# translations.rpy:130
old "Generate empty strings for translations"
@@ -1026,7 +1022,7 @@
# translations.rpy:180
old "Update Default Interface Translations"
new "Mise à jour de la traduction par défaut de l'interface"
new "Met à jour la traduction de l'interface par défaut"
# translations.rpy:200
old "The extract command allows you to extract string translations from an existing project into a temporary file.\n\nThe merge command merges extracted translations into another project."
@@ -1058,11 +1054,11 @@
# translations.rpy:282
old "Updating default interface translations..."
new "Mise à jour de la traduction par défaut de linterface en cours..."
new "Mise à jour en cours de la traduction de linterface par défaut..."
# translations.rpy:306
old "Extract Dialogue: [project.current.name!q]"
new "Extraire les dialogues : [project.current.name!q]"
new "Extraire le dialogue : [project.current.name!q]"
# translations.rpy:322
old "Format:"
@@ -1070,7 +1066,7 @@
# translations.rpy:330
old "Tab-delimited Spreadsheet (dialogue.tab)"
new "Feuille de calcul avec des tabulations comme séparateur (dialogue.tab)"
new "Feuille de calcul avec pour séparateur des tabulations (dialogue.tab)"
# translations.rpy:331
old "Dialogue Text Only (dialogue.txt)"
@@ -1078,11 +1074,11 @@
# translations.rpy:344
old "Strip text tags from the dialogue."
new "Retire les text tags (balises) des dialogues."
new "Retire les tags (balises) des dialogues."
# translations.rpy:345
old "Escape quotes and other special characters."
new "Protège (échappe) les apostrophes et les autres caractères spéciaux."
new "Protège (escape) les apostrophes et les autres caractères spéciaux."
# translations.rpy:346
old "Extract all translatable strings, not just dialogue."
@@ -1102,19 +1098,11 @@
# updater.rpy:86
old "The update channel controls the version of Ren'Py the updater will download. Please select an update channel:"
new "Le canal de mise à jour détermine la version de RenPy qui sera téléchargée. Sélectionnez un canal de mise à jour :"
new "Le canal de mise à jour détermine la version de RenPy qui sera téléchargée. Sil vous plaît, sélectionnez un canal de mise à jour :"
# updater.rpy:91
old "Release"
new "Stable"
# game/updater.rpy:64
old "Release (Ren'Py 8, Python 3)"
new "Stable (Ren'Py 8, Python 3)"
# game/updater.rpy:65
old "Release (Ren'Py 7, Python 2)"
new "Stable (Ren'Py 7, Python 2)"
new "Version actuelle."
# updater.rpy:97
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
@@ -1122,15 +1110,7 @@
# updater.rpy:102
old "Prerelease"
new "Pré-stable"
# game/updater.rpy:69
old "Prerelease (Ren'Py 8, Python 3)"
new "Pré-stable (Ren'Py 8, Python 3)"
# game/updater.rpy:70
old "Prerelease (Ren'Py 7, Python 2)"
new "Pré-stable (Ren'Py 7, Python 2)"
new "Version de test"
# updater.rpy:108
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
@@ -1146,35 +1126,11 @@
# updater.rpy:126
old "Nightly"
new "Journalière"
# game/updater.rpy:77
old "Nightly (Ren'Py 8, Python 3)"
new "Journalière (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly (Ren'Py 7, Python 2)"
new "Journalière (Ren'Py 7, Python 2)"
new "Nightly"
# updater.rpy:132
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "La toute dernière version de RenPy, encore en développement. Elle peut contenir les toutes dernières fonctionnalités, ou alors ne pas marcher du tout."
# game/updater.rpy:76
old "Nightly Fix"
new "Journalière Corrective"
# game/updater.rpy:77
old "Nightly Fix (Ren'Py 8, Python 3)"
new "Journalière Corrective (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly Fix (Ren'Py 7, Python 2)"
new "Journalière Corrective (Ren'Py 7, Python 2)"
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "Une version journalière qui corrige les bugs de la dernière version stable."
new "Les toutes dernières version de RenPy encore en développement. Vous pouvez alors utiliser les toutes dernières fonctionnalités, mais le logiciel peut également ne pas sexécuter du tout."
# updater.rpy:152
old "An error has occured:"
@@ -1233,16 +1189,16 @@
new "Le nom de fichier ne peut pas être vide."
# game/android.rpy:31
old "A 64-bit/x64 Java [JDK_REQUIREMENT] Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Un kit de développement Java [JDK_REQUIREMENT] 64-bit/x64 est requis pour construire des paquets Android depuis Windows. Le JDK est différent du JRE, donc il est possible d'avoir Java sans avoir le JDK.\n\n{a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}Téléchargez et installez le JDK{/a}, puis redémarrez Ren'Py."
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Un kit de développement Java 8 64-bit/x64 est requis pour construire des paquets Android depuis Windows. Le JDK est différent du JRE, donc il est possible d'avoir Java sans avoir le JDK.\n\n{a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}Téléchargez et installez le JDK{/a}, puis redémarrez Ren'Py."
# game/android.rpy:50
old "Selects the Debug build, which can be accessed through Android Studio. Changing between debug and release builds requires an uninstall from your device."
new "Selectionne le build de Debug, qui peut être atteint depuis Android Studio. Passer d'un build debug à un build stable nécessitera une désinstallation sur votre appareil."
new "Selectionne le build de Debug, qui peut être atteint depuis Android Studio. Passer d'un build debug à un build release nécessitera une désinstallation sur votre appareil."
# game/android.rpy:51
old "Selects the Release build, which can be uploaded to stores. Changing between debug and release builds requires an uninstall from your device."
new "Sélectionne le build Stable, qui peut être posté sur des magasins d'applications. Passer d'un build debug à un build stable nécessitera une désinstallation sur votre appareil."
new "Sélectionne le build de Release, qui peut être posté sur des magasins d'applications. Passer d'un build debug à un build release nécessitera une désinstallation sur votre appareil."
# game/android.rpy:313
old "Android: [project.current.display_name!q]"
@@ -1318,7 +1274,7 @@
# game/androidstrings.rpy:24
old "What is the name of the package?\n\nThis is usually of the form com.domain.program or com.domain.email.program. It may only contain ASCII letters and dots. It must contain at least one dot."
new "Quel est le nom du package ?\n\nIl est généralement de la forme com.domain.program ou com.domain.email.program. Il doit uniquement contenir des lettres ASCII et des points. Il doit contenir au moins un point."
new "Quel est le nom du package?\n\nIl est généralement de la forme com.domain.program ou com.domain.email.program. Il doit uniquement contenir des lettres ASCII et des points. Il doit contenir au moins un point."
# game/androidstrings.rpy:25
old "The package name may not be empty."
@@ -1590,7 +1546,7 @@
# game/gui7.rpy:339
old "Custom. The GUI is optimized for a 16:9 aspect ratio."
new "Personnalisé. Le GUI est optimisé pour un ratio de cadre 16:9."
new "Personnalisé. Le GUI est optimié pour un ratio de cadre 16:9."
# game/gui7.rpy:355
old "WIDTH"
@@ -1634,7 +1590,7 @@
# game/install.rpy:110
old "Install Libraries"
new "Installer des bibliothèques"
new "Installer les Bibliothèques"
# game/install.rpy:125
old "This screen allows you to install libraries that can't be distributed with Ren'Py. Some of these libraries may require you to agree to a third-party license before being used or distributed."
@@ -1654,7 +1610,7 @@
# game/install.rpy:151
old "Install Steam Support"
new "Installer le support Steam"
new "Installer le upport Steam"
# game/install.rpy:160
old "Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}."
@@ -1670,7 +1626,7 @@
# game/interface.rpy:136
old "Ren'Py Sponsor Information"
new "Informations sur les sponsors de Ren'Py"
new "Information sur les sponsors de Ren'Py Sponsor"
# game/interface.rpy:372
old "opening the log file"
@@ -1698,7 +1654,7 @@
# game/preferences.rpy:145
old "Reset window size"
new "Réinitialiser la taille de la fenêtre"
new "Réinisialiser la taille de la fenêtre"
# game/preferences.rpy:188
old "Force new tutorial"
@@ -1915,255 +1871,3 @@
# game/preferences.rpy:206
old "Daily check for update"
new "Vérification quotidienne des mises à jour"
# game/android.rpy:55
old "Lists the connected devices."
new "Liste les appareils connectés."
# game/android.rpy:58
old "Disconnects a device connected over Wi-Fi."
new "Déconnecte un appareil connecté via Wi-Fi."
# game/android.rpy:453
old "List Devices"
new "Lister les appareils"
# game/android.rpy:465
old "Wi-Fi Debugging Disconnect"
new "Debug : déconnexion Wi-Fi"
# game/android.rpy:603
old "This can be found in 'List Devices'."
new "Introuvable dans 'Lister les appareils'."
# game/androidstrings.rpy:17
old "Installing the bundle appears to have failed."
new "L'installation du bundle semble avoir échoué."
# game/androidstrings.rpy:19
old "Launching the app appears to have failed."
new "Le lancement de l'app semble avoir échoué."
# game/androidstrings.rpy:44
old "The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nYou can also set the JAVA_HOME environment variable to use a different version of Java."
new "La version de Java présente sur votre ordinateur ne semble pas être JDK 8, qui est la seule version supportée par le SDK Android. Si vous devez installer JDK 8, vous pouvez le télécharger ici :\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nVous pouvez aussi régler la variable d'environnement JAVA_HOME sur une autre version de Java."
# game/updater.rpy:109
old "• {a=https://www.renpy.org/doc/html/changelog.html}View change log{/a}"
new "• {a=https://www.renpy.org/doc/html/changelog.html}Regarder le changelog{/a}"
# game/updater.rpy:111
old "• {a=https://www.renpy.org/dev-doc/html/changelog.html}View change log{/a}"
new "• {a=https://www.renpy.org/dev-doc/html/changelog.html}Regarder le changelog{/a}"
# game/android.rpy:60
old "Removes Android temporary files."
new "Retirer les fichiers temporaires Android."
# game/android.rpy:472
old "Clean"
new "Nettoyer"
# game/android.rpy:628
old "Cleaning up Android project."
new "Nettoyage du projet Android."
# game/androidstrings.rpy:43
old "I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nThe JDK is different from the JRE, so it's possible you have Java without having the JDK. Please make sure you installed the 'JavaSoft (Oracle) registry keys'.\n\nWithout a working JDK, I can't continue."
new "Impossible d'utiliser javac pour compiler un fichier de test. Si vous n'avez pas installé Java Development Kit, téléchargez-le ici :\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nLe JDK est différent du JRE, donc il est possible d'avoir Java sans avoir le JDK. Vérifiez que vous avez installé les 'JavaSoft (Oracle) registry keys'.\n\nSans un JDK fonctionnel, je ne peux pas continuer."
# game/androidstrings.rpy:64
old "I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place."
new "J'ai ouvert le répertoire contenant android.keystore et bundle.keystore. Sauvegardez-les, et gardez-les dans un endroit sûr."
# game/choose_directory.rpy:67
old "Select Projects Directory"
new "Sélectionner le répertoire des Projets"
# game/distribute.rpy:1674
old "Copying files..."
new "Copie des fichiers..."
# game/distribute_gui.rpy:195
old "Update old-game"
new "Mettre à jour old-game"
# game/editor.rpy:152
old "A modern editor with many extensions including advanced Ren'Py integration."
new "Un éditeur moderne avec beaucoup d'extensions, y compris des intégrations Ren'Py avancées."
# game/editor.rpy:153
old "A modern editor with many extensions including advanced Ren'Py integration.\n{a=jump:reinstall_vscode}Upgrade Visual Studio Code to the latest version.{/a}"
new "Un éditeur moderne avec beaucoup d'extensions, y compris des intégrations Ren'Py avancées.\n{a=jump:reinstall_vscode}Mettez Visual Studio Code à jour.{/a}"
# game/editor.rpy:162
old "Visual Studio Code"
new "Visual Studio Code"
# game/editor.rpy:162
old "Up to 110 MB download required."
new "Jusqu'à 110 Mo nécessaires pour le téléchargement."
# game/editor.rpy:175
old "A modern and approachable text editor."
new "Un éditeur de texte moderne et accessible."
# game/editor.rpy:187
old "Atom"
new "Atom"
# game/editor.rpy:200
old "jEdit"
new "jEdit"
# game/editor.rpy:209
old "Visual Studio Code (System)"
new "Visual Studio Code (Système)"
# game/editor.rpy:209
old "Uses a copy of Visual Studio Code that you have installed outside of Ren'Py. It's recommended you install the language-renpy extension to add support for Ren'Py files."
new "Utilise une copie de Visual Studio Code que vous avez installé en-dehors de Ren'Py. Il est recommandé d'installer l'extension language-renpy pour ajouter la gestion des fichiers Ren'Py."
# game/installer.rpy:10
old "Downloading [extension.download_file]."
new "Téléchargement de [extension.download_file]."
# game/installer.rpy:11
old "Could not download [extension.download_file] from [extension.download_url]:\n{b}[extension.download_error]"
new "Impossible de télécharger [extension.download_file] depuis [extension.download_url] :\n{b}[extension.download_error]"
# game/installer.rpy:12
old "The downloaded file [extension.download_file] from [extension.download_url] is not correct."
new "le fichier [extension.download_file] téléchargé depuis [extension.download_url] est incorrect."
# game/interface.rpy:124
old "[interface.version]"
new "[interface.version]"
# game/preferences.rpy:154
old "Clean temporary files"
new "Nettoyer les fichiers temporaires"
# game/preferences.rpy:256
old "Cleaning temporary files..."
new "Nettoyage des fichiers temporaires..."
# game/project.rpy:280
old "This may be because the project is not writeable."
new "Il est possible que le projet ne soit pas accessible en écriture."
# game/translations.rpy:391
old "Language (or None for the default language):"
new "Langue (or None pour la langue par défaut) :"
# game/web.rpy:344
old "This feature is not supported in Ren'Py 8."
new "Cette fonctionnalité n'est pas supportée dans Ren'Py 8."
# game/web.rpy:344
old "We will restore support in a future release of Ren'Py 8. Until then, please use Ren'Py 7 for web support."
new "La version web sera supportée à nouveau dans une future version de Ren'Py 8. En attendant, utilisez Ren'Py 7 pour des distributions web."
# game/preferences.rpy:104
old "General"
new "Général"
# game/preferences.rpy:105
old "Options"
new "Options"
# game/preferences.rpy:244
old "Launcher Theme:"
new "Thème du lanceur :"
# game/preferences.rpy:254
old "Information about creating a custom theme can be found {a=[skins_url]}in the Ren'Py Documentation{/a}."
new "Plus d'informations sur comment créer un thème personnalisé se trouvent {a=[skins_url]}dans la documentation de Ren'Py{/a}."
# game/preferences.rpy:271
old "Install Libraries:"
new "Installer des bibliothèques :"
# game/preferences.rpy:327
old "{#in language font}Welcome! Please choose a language"
new "{font=fonts/Roboto-Light.ttf}Bienvenue ! Choisissez une langue{/font}"
# game/preferences.rpy:327
old "{#in language font}Start using Ren'Py in [lang_name]"
new "{font=fonts/Roboto-Light.ttf}Commencez à utiliser Ren'Py en [lang_name]{/font}"
# game/distribute_gui.rpy:231
old "(DLC)"
new "(DLC)"
# game/project.rpy:46
old "Lint checks your game for potential mistakes, and gives you statistics."
new "Lint vérifie votre jeu pour des erreurs communes, et génère des statistiques."
# game/web.rpy:484
old "Creating package..."
new "Création du package..."
# game/android.rpy:37
old "RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory."
new "RAPT a été installé, mais aucune clé na été configurée. Veuillez générer de nouvelles clés, ou copier android.keystore and bundle.keystore dans le dossier racine du projet."
# game/android.rpy:44
old "Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "Tentative d’émulation d'une console télé basée sur Android.\n\nLa manette est émulée par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
# game/android.rpy:46
old "Downloads and installs the Android SDK and supporting packages."
new "Télécharge et installe le kit de développement Android et les paquets requis."
# game/android.rpy:47
old "Generates the keys required to sign the package."
new "Génère les clés requises pour signer le package."
# game/android.rpy:381
old "Install SDK"
new "Installer le SDK"
# game/android.rpy:385
old "Generate Keys"
new "Générer les clés"
# game/androidstrings.rpy:32
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
new "Combien de RAM (in GB) voulez-vous allouer à Gradle ?\nEntrez un nombre entier positif."
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers and be positive."
new "La taille de RAM ne doit contenir que des chiffres et être positive."
# game/androidstrings.rpy:63
old "I found an android.keystore file in the rapt directory. Do you want to use this file?"
new "J'ai trouvé un fichier android.keystore dans le dossier \"rapt\". Voulez-vous l'utiliser ?"
# game/androidstrings.rpy:66
old "\n\nSaying 'No' will prevent key creation."
new "\n\nRépondre \"Non\" empêchera la création de clés."
# game/androidstrings.rpy:69
old "I found a bundle.keystore file in the rapt directory. Do you want to use this file?"
new "J'ai trouvé un fichier bundle.keystore dans le dossier \"rapt\". Voulez-vous l'utiliser ?"
# game/choose_directory.rpy:72
old "No directory was selected, but one is required."
new "Un chemin d'accès est nécessaire, mais aucun n'a été fourni."
# game/choose_directory.rpy:80
old "The selected directory does not exist."
new "Le dossier sélectionné n'existe pas."
# game/choose_directory.rpy:82
old "The selected directory is not writable."
new "Le dossier sélectionné n'est pas ouvert en écriture."
# game/distribute.rpy:554
old "This may be derived from build.name and config.version or build.version."
new "Cette variable peut être dérivée de build.name, et de config.version ou build.version."
# game/new_project.rpy:66
old "Warning : you are using Ren'Py 7. It is recommended to start new projects using Ren'Py 8 instead."
new "Attention : vous utilisez Ren'Py 7. Il est recommandé d'utiliser Ren'Py 8 pour de nouveaux projets."
+3 -3
View File
@@ -154,7 +154,7 @@
# options.rpy:165
old "## In a pattern:"
new "## Dans le format :"
new "## Dans le format:"
# options.rpy:167
old "## / is the directory separator."
@@ -185,8 +185,8 @@
new "## Les fichiers correspondant au format de documentation sont dupliqués pour les compilation sur Mac, c'est pourquoi ils apparaissent deux fois dans larchive zip."
# options.rpy:196
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
new "## Une clé de licence Google Play est requise pour permettre les achats depuis l'application. Vous pourrez la trouver dans la console de développement Google Play, sous \"Monétiser\" > \"Configuration de la monétisation\" > \"Licences\"."
old "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
new "## Une clé de licence A Google Play est requise pour télécharger les fichiers et permettre les achats dans l'application. Vous pourrez la trouver sur la page « Services & APIs » de la console de développement Google Play."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
+12 -32
View File
@@ -34,7 +34,7 @@
# screens.rpy:174
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## Cet écran doit créer une entrée affichable avec l'id \"input\" pour accepter les différents paramètres."
new "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
# screens.rpy:177
old "## http://www.renpy.org/doc/html/screen_special.html#input"
@@ -54,7 +54,7 @@
# screens.rpy:221
old "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
new "## Lorsque cette option est activée, les sous-titres du menu sont dits par \"narrator\". Si cette valeur est fausse, les légendes du menu seront affichées sous forme de boutons vides."
new "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
# screens.rpy:244
old "## Quick Menu screen"
@@ -162,7 +162,7 @@
# screens.rpy:369
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## L'instruction use inclut un autre écran à l'intérieur de celui-ci. Le vrai contenu du menu principal se trouve dans l'écran \"navigation\"."
new "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
# screens.rpy:413
old "## Game Menu screen"
@@ -170,11 +170,11 @@
# screens.rpy:415
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
new "## Ceci présente la structure commune de base d'un écran du menu de jeu. Il est appelé en lui passant le titre de l'écran, et il affiche l'arrière-plan, le titre et la navigation."
new "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
# screens.rpy:418
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## Le paramètre de défilement peut être None, ou \"viewport\" ou \"vpgrid\". Cet écran est destiné à être utilisé avec un ou plusieurs enfants, qui sont transclus (placés) à l'intérieur de l'écran."
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# screens.rpy:476
old "Return"
@@ -182,7 +182,7 @@
# screens.rpy:539
old "## About screen"
new "## Écran « À propos... »"
new "## Écran « À propos... »"
# screens.rpy:541
old "## This screen gives credit and copyright information about the game and Ren'Py."
@@ -450,7 +450,7 @@
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Active ou désactive les «sauts des dialogues»."
new "Active ou désactives les «sauts des dialogues»."
# screens.rpy:1027
old "Page Up"
@@ -621,8 +621,8 @@
new "## Les dialogues sont affichés soit dans une vpgrid soit dans une vbox."
# screens.rpy:1314
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
new "## Si fourni, affiche le menu. Le menu peut safficher de manière incorrecte si config.narrator_menu est initialisé à True."
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
new "## Si fourni, affiche le menu. Le menu peut safficher de manière incorrecte si config.narrator_menu est initialisé à True, comme cest le cas au-dessus."
# screens.rpy:1344
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
@@ -697,8 +697,8 @@
new "## Ceci détermine quels tags peuvent être affichés sur le screen de l'historique."
# gui/game/screens.rpy:1063
old "Mouse Wheel Up"
new "Molette vers le haut"
old "Mouse Wheel Up\nClick Rollback Side"
new "Molette vers le haut\nClic sur le côté du Rollback"
# gui/game/screens.rpy:1078
old "Left Trigger\nLeft Shoulder"
@@ -719,23 +719,3 @@
# gui/game/screens.rpy:1049
old "Opens the accessibility menu."
new "Ouvre le menu d'accessibilité."
# gui/game/screens.rpy:1397
old "## Bubble screen"
new "## Screen des bulles"
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
new "## Le screen des bulles est utilisé pour afficher des dialogues en utilisant des bulles de dialogue. Ce screen prend les mêmes paramètres que le screen say, doit prévoir un displayable avec l'id \"what\", et peut créer des displayables avec les ids \"namebox\", \"who\", et \"window\"."
# gui/game/screens.rpy:1417
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
new "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
# gui/game/screens.rpy:676
old "Upload Sync"
new "Uploader Sync"
# gui/game/screens.rpy:680
old "Download Sync"
new "Télécharger Sync"
+3
View File
@@ -0,0 +1,3 @@
translate french python:
gui.FONT_SCALE = .9
+20 -626
View File
@@ -163,43 +163,43 @@ translate german strings:
# 00gui.rpy:227
old "Are you sure?"
new "Bist Du sicher?"
new "Sind Sie sicher?"
# 00gui.rpy:228
old "Are you sure you want to delete this save?"
new "Bist Du sicher, dass Du diese Datei löschen möchtest?"
new "Sind Sie sicher, dass Sie diese Datei löschen möchten?"
# 00gui.rpy:229
old "Are you sure you want to overwrite your save?"
new "Bist Du sicher, dass Du diese Datei überschreiben möchtest?"
new "Sind Sie sicher, dass Sie diese Datei überschreiben möchten?"
# 00gui.rpy:230
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Beim Laden geht ungespeicherter Fortschritt verloren.\nBist Du sicher, dass Du das tun möchtest?"
new "Beim Laden geht ungespeicherter Fortschritt verloren.\nSind Sie sicher, dass Sie das tun möchten?"
# 00gui.rpy:231
old "Are you sure you want to quit?"
new "Bist Du sicher, dass Du das Spiel beenden möchtest?"
new "Sind Sie sicher, dass Sie beenden möchten?"
# 00gui.rpy:232
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Bist Du sicher, dass Du zurück zum Hauptmenü möchtest?\nUngespeicherter Fortschritt geht dabei verloren."
new "Sind Sie sicher, dass Sie zurück zum Hauptmenü möchten?\nUngespeicherter Fortschritt geht dabei verloren."
# 00gui.rpy:233
old "Are you sure you want to end the replay?"
new "Bist Du sicher, dass Du die Szenen-Wiederholung beenden möchtest?"
new "Sind Sie sicher, dass sie die Szenen-Wiederholung beenden möchten?"
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
new "Bist Du sicher, dass Du vorspulen möchtest?"
new "Sind Sie sicher, dass Sie Text überspringen möchten?"
# 00gui.rpy:235
old "Are you sure you want to skip to the next choice?"
new "Bist Du sicher, dass Du zur nächsten Entscheidung springen möchtest?"
new "Sind Sie sicher, dass Sie zur nächsten Auswahl springen möchten?"
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Bist Du sicher, dass Du ungesehenen Dialog bis zur nächsten Entscheidung überspringen möchtest?"
new "Sind Sie sicher, dass sie ungesehenen Dialog bis zur nächsten Entscheidung überspringen möchten?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
@@ -211,8 +211,7 @@ translate german strings:
# 00library.rpy:143
old "Clipboard voicing enabled. "
# Automatic translation.
new "Zwischenablage-Voicing aktiviert. "
new "Clipboard voicing enabled. "
# 00library.rpy:144
old "Self-voicing enabled. "
@@ -220,7 +219,7 @@ translate german strings:
# 00library.rpy:179
old "Skip Mode"
new "Vorspul-Modus"
new "Skip-Modus"
# 00library.rpy:262
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
@@ -228,20 +227,19 @@ translate german strings:
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
# Automatic translation.
new "Zwischenablage-Voicing aktiviert. Drücke 'Shift+C' zum Deaktivieren."
new "Clipboard voicing enabled. Press 'shift+C' to disable."
# 00preferences.rpy:424
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Sprachausgabe würde \"[renpy.display.tts.last]\" sagen. Drücke 'Alt+Shift+V' zum Deaktivieren."
new "Sprachausgabe würde \"[renpy.display.tts.last]\" sagen. Zum deaktivieren 'alt+shift+V' drücken."
# 00preferences.rpy:426
old "Self-voicing enabled. Press 'v' to disable."
new "Sprachausgabe aktiviert. Drücke 'V' zum Deaktivieren."
new "Sprachausgabe aktiviert. Zum deaktivieren 'v' drücken."
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Kontaktiere App Store\nBitte warten..."
new "Kontaktiert App Store\nBitte warten..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
@@ -249,7 +247,7 @@ translate german strings:
# 00updater.rpy:486
old "An error is being simulated."
new "Ein Fehler wird simuliert."
new "Ein Error wird simuliert."
# 00updater.rpy:662
old "Either this project does not support updating, or the update status file was deleted."
@@ -277,8 +275,7 @@ translate german strings:
# 00updater.rpy:1049
old "While unpacking {}, unknown type {}."
# Automatic translation.
new "Beim Entpacken {}, unbekannter Typ {}."
new "While unpacking {}, unknown type {}."
# 00updater.rpy:1393
old "Updater"
@@ -290,7 +287,7 @@ translate german strings:
# 00updater.rpy:1406
old "[u.version] is available. Do you want to install it?"
new "[u.version] ist verfügbar. Möchtest Du es installieren?"
new "[u.version] ist verfügbar. Möchten Sie sie installieren?"
# 00updater.rpy:1408
old "Preparing to download the updates."
@@ -330,612 +327,9 @@ translate german strings:
# 00gallery.rpy:585
old "slideshow"
# Automatic translation.
new "Diashow"
new "slideshow"
# 00gallery.rpy:586
old "return"
new "zurück"
translate german strings:
# renpy/common/00accessibility.rpy:32
old "bar"
new "bar"
# renpy/common/00accessibility.rpy:33
old "selected"
# Automatic translation.
new "ausgewählt"
# renpy/common/00accessibility.rpy:34
old "viewport"
new "Viewport"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
new "horizontaler Bildlauf"
# renpy/common/00accessibility.rpy:36
old "vertical scroll"
# Automatic translation.
new "vertikaler Bildlauf"
# renpy/common/00accessibility.rpy:37
old "activate"
new "aktivieren"
# renpy/common/00accessibility.rpy:38
old "deactivate"
# Automatic translation.
new "deaktivieren"
# renpy/common/00accessibility.rpy:39
old "increase"
new "erhöhen"
# renpy/common/00accessibility.rpy:40
old "decrease"
# Automatic translation.
new "verringern"
# renpy/common/00accessibility.rpy:138
old "Font Override"
# Automatic translation.
new "Schriftart überschreiben"
# renpy/common/00accessibility.rpy:142
old "Default"
# Automatic translation.
new "Standard"
# renpy/common/00accessibility.rpy:146
old "DejaVu Sans"
new "DejaVu Sans"
# renpy/common/00accessibility.rpy:150
old "Opendyslexic"
new "Opendyslexic"
# renpy/common/00accessibility.rpy:156
old "Text Size Scaling"
# Automatic translation.
new "Skalierung der Textgröße"
# renpy/common/00accessibility.rpy:162
old "Reset"
# Automatic translation.
new "Zurücksetzen"
# renpy/common/00accessibility.rpy:168
old "Line Spacing Scaling"
# Automatic translation.
new "Zeilenabstand Skalierung"
# renpy/common/00accessibility.rpy:180
old "High Contrast Text"
new "Kontrastreicher Text"
# renpy/common/00accessibility.rpy:193
old "Self-Voicing"
new "Sprachausgabe"
# renpy/common/00accessibility.rpy:197
old "Off"
# Automatic translation.
new "Aus"
# renpy/common/00accessibility.rpy:201
old "Text-to-speech"
new "Text-zu-Sprache"
# renpy/common/00accessibility.rpy:205
old "Clipboard"
# Automatic translation.
new "Zwischenablage"
# renpy/common/00accessibility.rpy:209
old "Debug"
# Automatic translation.
new "Debuggen"
# renpy/common/00accessibility.rpy:223
old "Self-Voicing Volume Drop"
new "Lautstärkeabfall Sprachausgabe"
# renpy/common/00accessibility.rpy:234
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
new "Die Optionen in diesem Menü dienen der Verbesserung der Zugänglichkeit. Sie funktionieren möglicherweise nicht mit allen Spielen, und einige Kombinationen von Optionen können das Spiel unspielbar machen. Dies ist kein Problem mit dem Spiel oder der Engine. Die besten Ergebnisse beim Ändern von Schriftarten erzielst Du, wenn Du die ursprüngliche Textgröße beibehältst."
# renpy/common/00action_file.rpy:378
old "Save slot %s: [text]"
new "Speicherplatz %s speichern: [text]"
# renpy/common/00action_file.rpy:461
old "Load slot %s: [text]"
new "Speicherplatz %s laden: [text]"
# renpy/common/00action_file.rpy:514
old "Delete slot [text]"
new "Speicherplatz löschen [text]"
# renpy/common/00action_file.rpy:593
old "File page auto"
new "Spielstände: Seite auto-speichern"
# renpy/common/00action_file.rpy:595
old "File page quick"
new "Spielstände: Seite schnell-speichern"
# renpy/common/00action_file.rpy:597
old "File page [text]"
new "Spielstände: Seite [text]"
# renpy/common/00action_file.rpy:796
old "Next file page."
new "Nächste Seite."
# renpy/common/00action_file.rpy:868
old "Previous file page."
new "Vorherige Seite."
# renpy/common/00action_file.rpy:944
old "Quick save."
# Automatic translation.
new "Schnell speichern."
# renpy/common/00action_file.rpy:963
old "Quick load."
# Automatic translation.
new "Schnell laden."
# renpy/common/00action_other.rpy:381
old "Language [text]"
# Automatic translation.
new "Sprache [text]"
# renpy/common/00director.rpy:705
old "The interactive director is not enabled here."
# Automatic translation.
new "Der interaktive Regisseur ist hier nicht aktiviert."
# renpy/common/00director.rpy:1504
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1510
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1574
old "Done"
new "Fertig"
# renpy/common/00director.rpy:1584
old "(statement)"
new "(Statement)"
# renpy/common/00director.rpy:1585
old "(tag)"
new "(Tag)"
# renpy/common/00director.rpy:1586
old "(attributes)"
new "(Attribute)"
# renpy/common/00director.rpy:1587
old "(transform)"
new "(Transform)"
# renpy/common/00director.rpy:1612
old "(transition)"
new "(Transition)"
# renpy/common/00director.rpy:1624
old "(channel)"
new "(Kanal)"
# renpy/common/00director.rpy:1625
old "(filename)"
# Automatic translation.
new "(Dateiname)"
# renpy/common/00director.rpy:1654
old "Change"
new "Ändern"
# renpy/common/00director.rpy:1656
old "Add"
new "Hinzufügen"
# renpy/common/00director.rpy:1662
old "Remove"
new "Entfernen"
# renpy/common/00director.rpy:1697
old "Statement:"
new "Statement:"
# renpy/common/00director.rpy:1718
old "Tag:"
new "Tag:"
# renpy/common/00director.rpy:1734
old "Attributes:"
# Automatic translation.
new "Attribute:"
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
new "Klicke auf das Attribut, um es umzuschalten; klicke mit der rechten Maustaste, um das negative Attribut umzuschalten."
# renpy/common/00director.rpy:1757
old "Transforms:"
new "Transforms:"
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
new "Klicke, um das Transform festzulegen; klicke mit der rechten Maustaste, um es zur Liste hinzuzufügen."
# renpy/common/00director.rpy:1780
old "Behind:"
# Automatic translation.
new "Hinter:"
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
# Automatic translation.
new "Zum Einstellen klicken, zum Hinzufügen zur Liste mit der rechten Maustaste klicken."
# renpy/common/00director.rpy:1801
old "Transition:"
new "Transition:"
# renpy/common/00director.rpy:1819
old "Channel:"
# Automatic translation.
new "Kanal:"
# renpy/common/00director.rpy:1837
old "Audio Filename:"
# Automatic translation.
new "Audio Dateiname:"
# renpy/common/00gui.rpy:456
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
new "Dieser Spielstand wurde auf einem anderen Gerät erstellt. Böswillig erstellte Speicherstände können Deinem Computer schaden. Vertraust Du dem Ersteller dieses Spielstands und allen, die die Datei geändert haben könnten?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
# Automatic translation.
new "Vertraust Du dem Gerät, auf dem die Sicherung erstellt wurde? Du solltest nur dann Ja wählen, wenn Du der einzige Benutzer des Geräts bist."
# renpy/common/00keymap.rpy:322
old "Failed to save screenshot as %s."
# Automatic translation.
new "Bildschirmfoto konnte nicht als %s gespeichert werden."
# renpy/common/00preferences.rpy:271
old "display"
# Automatic translation.
new "Anzeige"
# renpy/common/00preferences.rpy:283
old "transitions"
new "Übergänge"
# renpy/common/00preferences.rpy:292
old "skip transitions"
new "Übergänge überspringen"
# renpy/common/00preferences.rpy:294
old "video sprites"
# Automatic translation.
new "Video-Sprites"
# renpy/common/00preferences.rpy:303
old "show empty window"
# Automatic translation.
new "leeres Fenster anzeigen"
# renpy/common/00preferences.rpy:312
old "text speed"
# Automatic translation.
new "Textgeschwindigkeit"
# renpy/common/00preferences.rpy:320
old "joystick"
# Automatic translation.
new "Joystick"
# renpy/common/00preferences.rpy:320
old "joystick..."
# Automatic translation.
new "Joystick..."
# renpy/common/00preferences.rpy:327
old "skip"
# Automatic translation.
new "überspringen"
# renpy/common/00preferences.rpy:330
old "skip unseen [text]"
# Automatic translation.
new "unbesehen überspringen [text]"
# renpy/common/00preferences.rpy:335
old "skip unseen text"
# Automatic translation.
new "ungesehenen Text überspringen"
# renpy/common/00preferences.rpy:337
old "begin skipping"
new "mit dem Vorspulen beginnen"
# renpy/common/00preferences.rpy:341
old "after choices"
new "nach Entscheidungen"
# renpy/common/00preferences.rpy:348
old "skip after choices"
new "Vorspulen nach Entscheidungen"
# renpy/common/00preferences.rpy:350
old "auto-forward time"
# Automatic translation.
new "Zeit des automatischen Blätterns"
# renpy/common/00preferences.rpy:364
old "auto-forward"
# Automatic translation.
new "automatisches Blättern"
# renpy/common/00preferences.rpy:371
old "Auto forward"
# Automatic translation.
new "Automatisch vorwärts"
# renpy/common/00preferences.rpy:374
old "auto-forward after click"
# Automatic translation.
new "automatisches Weiterleiten nach Klick"
# renpy/common/00preferences.rpy:383
old "automatic move"
# Automatic translation.
new "automatischer Umzug"
# renpy/common/00preferences.rpy:392
old "wait for voice"
# Automatic translation.
new "auf Stimme warten"
# renpy/common/00preferences.rpy:401
old "voice sustain"
# Automatic translation.
new "Stimmhaltung"
# renpy/common/00preferences.rpy:410
old "self voicing"
new "Sprachausgabe"
# renpy/common/00preferences.rpy:419
old "self voicing volume drop"
new "Lautstärkeabnahme der Sprachausgabe"
# renpy/common/00preferences.rpy:427
old "clipboard voicing"
new "Sprachausgabe zur Zwischenablage"
# renpy/common/00preferences.rpy:436
old "debug voicing"
new "Sprachausgabe debuggen"
# renpy/common/00preferences.rpy:445
old "emphasize audio"
# Automatic translation.
new "Audio hervorheben"
# renpy/common/00preferences.rpy:454
old "rollback side"
# Automatic translation.
new "Rollback-Seite"
# renpy/common/00preferences.rpy:464
old "gl powersave"
new "gl powersave"
# renpy/common/00preferences.rpy:470
old "gl framerate"
# Automatic translation.
new "gl-Framerate"
# renpy/common/00preferences.rpy:473
old "gl tearing"
new "gl tearing"
# renpy/common/00preferences.rpy:476
old "font transform"
new "Schriftart Transform"
# renpy/common/00preferences.rpy:479
old "font size"
# Automatic translation.
new "Schriftgröße"
# renpy/common/00preferences.rpy:487
old "font line spacing"
# Automatic translation.
new "Zeilenabstand der Schrift"
# renpy/common/00preferences.rpy:495
old "system cursor"
# Automatic translation.
new "System-Cursor"
# renpy/common/00preferences.rpy:504
old "renderer menu"
# Automatic translation.
new "Renderer-Menü"
# renpy/common/00preferences.rpy:507
old "accessibility menu"
new "Barrierefreiheit-Menü"
# renpy/common/00preferences.rpy:510
old "high contrast text"
new "kontrastreicher Text"
# renpy/common/00preferences.rpy:519
old "audio when minimized"
# Automatic translation.
new "Audio im minimierten Zustand"
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
new "Audio wenn im Hintergrund"
# renpy/common/00preferences.rpy:537
old "web cache preload"
# Automatic translation.
new "Web-Cache vorladen"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
# Automatic translation.
new "Stimme nach dem Spielmenü"
# renpy/common/00preferences.rpy:571
old "main volume"
new "Master-Lautstärke"
# renpy/common/00preferences.rpy:572
old "music volume"
new "Musik-Lautstärke"
# renpy/common/00preferences.rpy:573
old "sound volume"
new "Ton-Lautstärke"
# renpy/common/00preferences.rpy:574
old "voice volume"
new "Stimmen-Lautstärke"
# renpy/common/00preferences.rpy:575
old "mute main"
new "Master stummschalten"
# renpy/common/00preferences.rpy:576
old "mute music"
# Automatic translation.
new "Musik stummschalten"
# renpy/common/00preferences.rpy:577
old "mute sound"
# Automatic translation.
new "Ton stummschalten"
# renpy/common/00preferences.rpy:578
old "mute voice"
new "Stimme stummschalten"
# renpy/common/00preferences.rpy:579
old "mute all"
new "alles stummschalten"
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
# Automatic translation.
new "Sprechblasen-Editor"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
# Automatic translation.
new "(ausblenden)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
# Automatic translation.
new "Sync heruntergeladen."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
# Automatic translation.
new "Es konnte keine Verbindung zum Ren'Py Sync Server hergestellt werden."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
# Automatic translation.
new "Der Ren'Py Sync-Server hat eine Zeitüberschreitung."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
# Automatic translation.
new "Bei der Verbindung mit dem Ren'Py Sync-Server ist ein unbekannter Fehler aufgetreten."
# renpy/common/00sync.rpy:267
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
# Automatic translation.
new "Der Ren'Py Sync-Server verfügt nicht über eine Kopie dieser Synchronisierung. Die Sync-ID ist möglicherweise ungültig, oder es wurde eine Zeitüberschreitung festgestellt."
# renpy/common/00sync.rpy:409
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
# Automatic translation.
new "Bitte gib die von Dir erstellte Sync-ID ein.\nGie niemals eine Sync-ID ein, die Du nicht selbst erstellt hast."
# renpy/common/00sync.rpy:428
old "The sync ID is not in the correct format."
# Automatic translation.
new "Die Sync-ID hat nicht das richtige Format."
# renpy/common/00sync.rpy:448
old "The sync could not be decrypted."
# Automatic translation.
new "Die Synchronisierung konnte nicht entschlüsselt werden."
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
# Automatic translation.
new "Die Synchronisation gehört zu einem anderen Spiel."
# renpy/common/00sync.rpy:476
old "The sync contains a file with an invalid name."
# Automatic translation.
new "Die Synchronisierung enthält eine Datei mit einem ungültigen Namen."
# renpy/common/00sync.rpy:529
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
# Automatic translation.
new "Dadurch werden Deine Spielstände auf den {a=https://sync.renpy.org}Ren'Py Sync Server{/a} hochgeladen.\nMöchtest Du fortfahren?"
# renpy/common/00sync.rpy:558
old "Enter Sync ID"
# Automatic translation.
new "Sync-ID eingeben"
# renpy/common/00sync.rpy:569
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
# Automatic translation.
new "Dadurch wird der {a=https://sync.renpy.org}Ren'Py Sync Server{/a} kontaktiert."
# renpy/common/00sync.rpy:596
old "Sync Success"
# Automatic translation.
new "Sync-Erfolg"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
# Automatic translation.
new "Die Sync-ID lautet:"
# renpy/common/00sync.rpy:605
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
# Automatic translation.
new "Du kannst diese ID verwenden, um Deinen Spielstand auf ein anderes Gerät herunterzuladen.\nDiese Synchronisierung läuft in einer Stunde ab.\nRen'Py Sync wird unterstützt von {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
# renpy/common/00sync.rpy:631
old "Sync Error"
# Automatic translation.
new "Sync-Fehler"
+8 -106
View File
@@ -59,13 +59,11 @@ translate german strings:
# _developer/developer.rpym:412
old "Rectangle copied to clipboard."
# Automatic translation.
new "Rechteck in die Zwischenablage kopiert."
new "Rectangle copied to clipboard."
# _developer/developer.rpym:415
old "Position copied to clipboard."
# Automatic translation.
new "Position in die Zwischenablage kopiert."
new "Position copied to clipboard."
# _developer/developer.rpym:524
old "✔ "
@@ -77,8 +75,7 @@ translate german strings:
# _developer/developer.rpym:532
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# Automatic translation.
new "\n{color=#cfc}✔ vorhergesagtes Bild (gut){/color}\n{color=#fcc}✘ unvorhergesehenes Bild (schlecht){/color}\n{color=#fff}Zum Verschieben ziehen.{/color}"
new "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
@@ -94,8 +91,7 @@ translate german strings:
# _developer/inspector.rpym:71
old "Location"
# Automatic translation.
new "Standort"
new "Location"
# _developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
@@ -119,15 +115,15 @@ translate german strings:
# 00console.rpy:182
old "Press <esc> to exit console. Type help for help.\n"
new "Drücke <esc>, um die Konsole zu schließen. Gib „help“ ein, um die Hilfe anzuzeigen.\n"
new "Drücken Sie <esc>, um die Konsole zu schließen. Geben Sie „help“ ein, um die Hilfe anzuzeigen.\n"
# 00console.rpy:186
old "Ren'Py script enabled."
new "Ren'Py Skript aktiviert."
new "RenPy Skript aktiviert."
# 00console.rpy:188
old "Ren'Py script disabled."
new "Ren'Py Skript deaktiviert."
new "RenPy Skript deaktiviert."
# 00console.rpy:398
old "help: show this help"
@@ -143,7 +139,7 @@ translate german strings:
# 00console.rpy:415
old " <python expression or statement>: run the expression or statement"
new " <python Ausdruck oder Anweisung>: startet den Ausdruck oder die Anweisung"
new " <python expression or statement>: startet den Ausdruck oder die Anweisung"
# 00console.rpy:423
old "clear: clear the console history"
@@ -181,97 +177,3 @@ translate german strings:
old "jump <label>: jumps to label"
new "jump <label>: springt zum Label"
translate german strings:
# renpy/common/_developer/developer.rpym:43
old "Interactive Director (D)"
new "Interaktiver Regisseur (D)"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "Übersicht persistenter Variablen"
# renpy/common/_developer/developer.rpym:59
old "Show Image Load Log (F4)"
new "Ladeprotokoll aller Bilder anzeigen (F4)"
# renpy/common/_developer/developer.rpym:62
old "Hide Image Load Log (F4)"
new "Ladeprotokoll aller Bilder ausblenden (F4)"
# renpy/common/_developer/developer.rpym:65
old "Image Attributes"
# Automatic translation.
new "Bild-Attribute"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Sprechblasen-Editor (Shift+B)"
# renpy/common/_developer/developer.rpym:97
old "[name] [attributes] (hidden)"
new "[Name] [Attribute] (versteckt)"
# renpy/common/_developer/developer.rpym:101
old "[name] [attributes]"
new "[Name] [Attribute]"
# renpy/common/_developer/developer.rpym:162
old "Hide deleted"
new "Gelöschtes verbergen"
# renpy/common/_developer/developer.rpym:162
old "Show deleted"
new "Gelöschtes anzeigen"
# renpy/common/_developer/developer.rpym:389
old "Type to filter: "
# Automatic translation.
new "Filtertyp: "
# renpy/common/_developer/developer.rpym:507
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
# Automatic translation.
new "Texturen: [tex_count] ([tex_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:511
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# Automatic translation.
new "Bild-Cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
# Automatic translation.
new "help: diese Hilfe anzeigen\n help <expr>: Signatur und Dokumentation von <expr> anzeigen"
# renpy/common/00console.rpy:813
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
new "Die Hilfe kann undokumentierte Funktionen anzeigen. Bitte prüfe, ob die Funktion\noder Klasse, die Du verwenden möchtest, dokumentiert ist.\n\n"
# renpy/common/00console.rpy:854
old "stack: print the return stack"
new "stack: den Stack anzeigen"
# renpy/common/00console.rpy:908
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
new "watch <expression>: einen Python-Ausdruck beobachten\n watch short: macht die Darstellung der nachverfolgten Ausdrücke kurz (Voreinstellung)\n watch long: macht die Darstellung von verfolgten Ausdrücken wie sie sind"
# renpy/common/00console.rpy:1028
old "short: Shorten the representation of objects on the console (default)."
# Automatic translation.
new "short: Verkürzt die Darstellung von Objekten auf der Konsole (Voreinstellung)."
# renpy/common/00console.rpy:1032
old "long: Print the full representation of objects on the console."
# Automatic translation.
new "long: Gibt die vollständige Darstellung der Objekte auf der Konsole aus."
# renpy/common/00console.rpy:1036
old "escape: Enables escaping of unicode symbols in unicode strings."
new "escape: Aktiviert das Escaping von Unicode-Symbolen in Unicode-Strings."
# renpy/common/00console.rpy:1040
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
new "unescape: Deaktiviert das Escaping von Unicode-Symbolen in Unicode-Zeichenfolgen und druckt sie so, wie sie sind (Voreinstellung)."
+15 -147
View File
@@ -23,7 +23,7 @@ translate german strings:
# 00gltest.rpy:93
old "Enable"
new "Aktivieren"
new "Enable"
# 00gltest.rpy:109
old "Changes will take effect the next time this program is run."
@@ -39,7 +39,7 @@ translate german strings:
# 00gltest.rpy:148
old "This computer is not using shaders."
new "Dieser Computer verwendet keine Shader."
new "Dieser Computer verwendet keine Shaders."
# 00gltest.rpy:150
old "This computer is displaying graphics slowly."
@@ -91,31 +91,27 @@ translate german strings:
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
# Automatic translation.
new "Gamepad zum Kalibrieren auswählen"
new "Select Gamepad to Calibrate"
# 00gamepad.rpy:35
old "No Gamepads Available"
# Automatic translation.
new "Keine Gamepads verfügbar"
new "No Gamepads Available"
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
# Automatic translation.
new "Kalibrierung von [name] ([i]/[total])"
new "Calibrating [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!s] [kind]."
new "Drücke oder bewege [control!s] [kind] ."
new "Press or move the [control!s] [kind]."
# 00gamepad.rpy:66
old "Skip (A)"
# Automatic translation.
new "Überspringen (A)"
new "Skip (A)"
# 00gamepad.rpy:69
old "Back (B)"
new "Zurück (B)"
new "Back (B)"
# _errorhandling.rpym:495
old "Open Traceback"
@@ -127,13 +123,11 @@ translate german strings:
# _errorhandling.rpym:499
old "Copy to Clipboard"
# Automatic translation.
new "In die Zwischenablage kopieren"
new "Copy to Clipboard"
# _errorhandling.rpym:501
old "Copies the traceback.txt file to the clipboard."
# Automatic translation.
new "Kopiert die Datei traceback.txt in die Zwischenablage."
new "Copies the traceback.txt file to the clipboard."
# _errorhandling.rpym:519
old "An exception has occurred."
@@ -141,11 +135,11 @@ translate german strings:
# _errorhandling.rpym:538
old "Rollback"
new "Zurückspulen"
new "Zurückscrollen"
# _errorhandling.rpym:540
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Versucht zu einem früheren Zeitpunkt zu spulen, damit Du erneut speichern oder eine andere Entscheidung treffen kannst."
new "Versucht zu einem früheren Zeitpunkt zu gehen und ermöglicht es zu speichern oder eine andere Auswahl zu treffen."
# _errorhandling.rpym:543
old "Ignore"
@@ -153,7 +147,7 @@ translate german strings:
# _errorhandling.rpym:545
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Ignoriert den Fehler und ermöglicht es, fortzufahren. Dies führt oft zu weiteren Fehlern."
new "Ignoriert den Fehler und ermöglicht es, fortzusetzen. Dies führt oft zu weiteren Fehlern."
# _errorhandling.rpym:548
old "Reload"
@@ -173,7 +167,7 @@ translate german strings:
# _errorhandling.rpym:606
old "Open Parse Errors"
new "Syntaxfehler öffnen"
new "Parse Errors öffnen"
# _errorhandling.rpym:608
old "Opens the errors.txt file in a text editor."
@@ -181,131 +175,5 @@ translate german strings:
# _errorhandling.rpym:612
old "Copies the errors.txt file to the clipboard."
# Automatic translation.
new "Kopiert die Datei errors.txt in die Zwischenablage."
translate german strings:
# renpy/common/00gltest.rpy:89
old "Renderer"
new "Renderer"
# renpy/common/00gltest.rpy:100
old "Force GL Renderer"
new "Force GL Renderer"
# renpy/common/00gltest.rpy:105
old "Force ANGLE Renderer"
new "Force ANGLE Renderer"
# renpy/common/00gltest.rpy:110
old "Force GLES Renderer"
# Automatic translation.
new "GLES-Renderer erzwingen"
# renpy/common/00gltest.rpy:116
old "Force GL2 Renderer"
# Automatic translation.
new "GL2-Renderer erzwingen"
# renpy/common/00gltest.rpy:121
old "Force ANGLE2 Renderer"
# Automatic translation.
new "ANGLE2-Renderer erzwingen"
# renpy/common/00gltest.rpy:126
old "Force GLES2 Renderer"
# Automatic translation.
new "GLES2-Renderer erzwingen"
# renpy/common/00gltest.rpy:136
old "Enable (No Blocklist)"
# Automatic translation.
new "Aktivieren (keine Sperrliste)"
# renpy/common/00gltest.rpy:159
old "Powersave"
new "Energiesparen"
# renpy/common/00gltest.rpy:173
old "Framerate"
new "Framerate"
# renpy/common/00gltest.rpy:177
old "Screen"
# Automatic translation.
new "Bildschirm"
# renpy/common/00gltest.rpy:181
old "60"
new "60"
# renpy/common/00gltest.rpy:185
old "30"
new "30"
# renpy/common/00gltest.rpy:191
old "Tearing"
new "Tearing"
# renpy/common/00gltest.rpy:249
old "This game requires use of GL2 that can't be initialised."
# Automatic translation.
new "Dieses Spiel erfordert die Verwendung von GL2, das nicht initialisiert werden kann."
# renpy/common/00gltest.rpy:259
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
new "Die Datei {a=edit:1:log.txt}log.txt{/a} kann Informationen enthalten, die Dir helfen, das Problem mit Deinem Computer zu lösen."
# renpy/common/00gltest.rpy:264
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
new "Weitere Einzelheiten zur Behebung dieses Problems findest Du in der Dokumentation {a=[url]}{/a} ."
# renpy/common/00gltest.rpy:281
old "Change render options"
# Automatic translation.
new "Renderoptionen ändern"
# renpy/common/00gamepad.rpy:58
old "Press or move the '[control!s]' [kind]."
new "Drücke oder bewege die Taste '[control!s]' [kind]."
# renpy/common/_errorhandling.rpym:555
old "Open"
new "Öffnen"
# renpy/common/_errorhandling.rpym:559
old "Copy BBCode"
# Automatic translation.
new "BBCode kopieren"
# renpy/common/_errorhandling.rpym:561
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
# Automatic translation.
new "Kopiert die Datei traceback.txt in die Zwischenablage als BBcode für Foren wie https://lemmasoft.renai.us/."
# renpy/common/_errorhandling.rpym:563
old "Copy Markdown"
# Automatic translation.
new "Markdown kopieren"
# renpy/common/_errorhandling.rpym:565
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
# Automatic translation.
new "Kopiert die Datei traceback.txt in die Zwischenablage als Markdown für Discord."
# renpy/common/_errorhandling.rpym:626
old "Ignores the exception, allowing you to continue."
new "Ignoriert den Fehler, so dass Du fortfahren kannst."
# renpy/common/_errorhandling.rpym:637
old "Console"
# Automatic translation.
new "Konsole"
# renpy/common/_errorhandling.rpym:639
old "Opens a console to allow debugging the problem."
# Automatic translation.
new "Öffnet eine Konsole, um das Problem zu beheben."
new "Copies the errors.txt file to the clipboard."
+100 -267
View File
@@ -3,333 +3,267 @@ translate german strings:
# gui.rpy:2
old "## Initialization"
# Automatic translation.
new "## Initialisierung"
new "## Initialization"
# gui.rpy:5
old "## The init offset statement causes the init code in this file to run before init code in any other file."
# Automatic translation.
new "## Die Anweisung init offset bewirkt, dass der init-Code in dieser Datei vor dem init-Code in jeder anderen Datei ausgeführt wird."
new "## The init offset statement causes the init code in this file to run before init code in any other file."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
# Automatic translation.
new "## Der Aufruf von gui.init setzt die Stile auf sinnvolle Standardwerte zurück und setzt die Breite und Höhe des Spiels."
new "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
# gui.rpy:21
old "## Colors"
# Automatic translation.
new "## Farben"
new "## Colors"
# gui.rpy:23
old "## The colors of text in the interface."
# Automatic translation.
new "## Die Farben des Textes in der Schnittstelle."
new "## The colors of text in the interface."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
# Automatic translation.
new "## Eine Akzentfarbe, die in der gesamten Benutzeroberfläche zur Beschriftung und Hervorhebung von Text verwendet wird."
new "## An accent color used throughout the interface to label and highlight text."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie weder ausgewählt ist noch mit dem Mauszeiger bewegt wird."
new "## The color used for a text button when it is neither selected nor hovered."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
# Automatic translation.
new "## Die kleine Farbe wird für kleinen Text verwendet, der heller/dunkler sein muss, um den gleichen Effekt zu erzielen."
new "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
# Automatic translation.
new "## Die Farbe, die für Schaltflächen und Balken verwendet wird, die mit dem Mauszeiger bewegt werden."
new "## The color that is used for buttons and bars that are hovered."
# gui.rpy:39
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie ausgewählt, aber nicht fokussiert ist. Eine Schaltfläche ist ausgewählt, wenn sie der aktuelle Bildschirm oder Einstellungswert ist."
new "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie nicht ausgewählt werden kann."
new "## The color used for a text button when it cannot be selected."
# gui.rpy:46
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
# Automatic translation.
new "## Farben für die Teile der Balken, die nicht ausgefüllt sind. Diese Farben werden nicht direkt verwendet, aber bei der Neuerstellung von Balkenbilddateien eingesetzt."
new "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
# Automatic translation.
new "## Die Farben, die für Dialog- und Menüauswahltext verwendet werden."
new "## The colors used for dialogue and menu choice text."
# gui.rpy:56
old "## Fonts and Font Sizes"
# Automatic translation.
new "## Schriftarten und Schriftgrößen"
new "## Fonts and Font Sizes"
# gui.rpy:58
old "## The font used for in-game text."
# Automatic translation.
new "## Die für den Text im Spiel verwendete Schriftart."
new "## The font used for in-game text."
# gui.rpy:61
old "## The font used for character names."
# Automatic translation.
new "## Die für Zeichennamen verwendete Schriftart."
new "## The font used for character names."
# gui.rpy:64
old "## The font used for out-of-game text."
# Automatic translation.
new "## Die Schriftart, die für den Text außerhalb des Spiels verwendet wird."
new "## The font used for out-of-game text."
# gui.rpy:67
old "## The size of normal dialogue text."
# Automatic translation.
new "## Die Größe des normalen Dialogtextes."
new "## The size of normal dialogue text."
# gui.rpy:70
old "## The size of character names."
# Automatic translation.
new "## Die Größe der Zeichennamen."
new "## The size of character names."
# gui.rpy:73
old "## The size of text in the game's user interface."
# Automatic translation.
new "## Die Größe des Textes in der Benutzeroberfläche des Spiels."
new "## The size of text in the game's user interface."
# gui.rpy:76
old "## The size of labels in the game's user interface."
# Automatic translation.
new "## Die Größe der Beschriftungen in der Benutzeroberfläche des Spiels."
new "## The size of labels in the game's user interface."
# gui.rpy:79
old "## The size of text on the notify screen."
# Automatic translation.
new "## Die Größe des Textes auf dem Benachrichtigungsbildschirm."
new "## The size of text on the notify screen."
# gui.rpy:82
old "## The size of the game's title."
# Automatic translation.
new "## Die Größe des Titels des Spiels."
new "## The size of the game's title."
# gui.rpy:86
old "## Main and Game Menus"
# Automatic translation.
new "## Haupt- und Spielmenü"
new "## Main and Game Menus"
# gui.rpy:88
old "## The images used for the main and game menus."
# Automatic translation.
new "## Die Bilder, die für das Haupt- und das Spielmenü verwendet werden."
new "## The images used for the main and game menus."
# gui.rpy:92
old "## Should we show the name and version of the game?"
# Automatic translation.
new "## Sollten wir den Namen und die Version des Spiels anzeigen?"
new "## Should we show the name and version of the game?"
# gui.rpy:96
old "## Dialogue"
# Automatic translation.
new "## Dialog"
new "## Dialogue"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
# Automatic translation.
new "## Diese Variablen steuern, wie der Dialog zeilenweise auf dem Bildschirm angezeigt wird."
new "## These variables control how dialogue is displayed on the screen one line at a time."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
# Automatic translation.
new "## Die Höhe des Textfeldes, das den Dialog enthält."
new "## The height of the textbox containing dialogue."
# gui.rpy:104
old "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
# Automatic translation.
new "## Die Platzierung des Textfeldes vertikal auf dem Bildschirm. 0.0 ist der obere Rand, 0.5 ist die Mitte und 1.0 ist der untere Rand."
new "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
# gui.rpy:109
old "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
# Automatic translation.
new "## Die Platzierung des Namens des sprechenden Charakters, relativ zum Textfeld. Dies kann eine ganze Anzahl von Pixeln von links oder oben sein, oder 0,5 bis zur Mitte."
new "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
# gui.rpy:114
old "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# Automatic translation.
new "## Die horizontale Ausrichtung des Namens des Zeichens. Dies kann 0.0 für linksbündig, 0.5 für zentriert und 1.0 für rechtsbündig sein."
new "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# gui.rpy:118
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
# Automatic translation.
new "## Die Breite, die Höhe und die Ränder des Feldes, das den Namen des Zeichens enthält, oder None, um es automatisch zu vergrößern."
new "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
# gui.rpy:123
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
# Automatic translation.
new "## Die Ränder des Feldes, das den Namen des Zeichens enthält, in der Reihenfolge links, oben, rechts, unten."
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
# Automatic translation.
new "## Wenn True, wird der Hintergrund des Namensfeldes gekachelt, wenn False, wird der Hintergrund des Namensfeldes skaliert."
new "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
# gui.rpy:132
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
# Automatic translation.
new "## Die Platzierung des Dialogs relativ zum Textfeld. Dies kann eine ganze Anzahl von Pixeln relativ zur linken oder oberen Seite des Textfeldes oder 0,5 zur Mitte sein."
new "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
# Automatic translation.
new "## Die maximale Breite des Dialogtextes, in Pixeln."
new "## The maximum width of dialogue text, in pixels."
# gui.rpy:141
old "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# Automatic translation.
new "## Die horizontale Ausrichtung des Dialogtextes. Dies kann 0.0 für linksbündig, 0.5 für zentriert und 1.0 für rechtsbündig sein."
new "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
# gui.rpy:146
old "## Buttons"
# Automatic translation.
new "## Schaltflächen"
new "## Buttons"
# gui.rpy:148
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
# Automatic translation.
new "## Diese Variablen, zusammen mit den Bilddateien in gui/button, steuern Aspekte der Darstellung von Schaltflächen."
new "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
# gui.rpy:151
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
# Automatic translation.
new "## Die Breite und Höhe einer Schaltfläche, in Pixeln. Falls keine, berechnet Ren'Py eine Größe."
new "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
# gui.rpy:155
old "## The borders on each side of the button, in left, top, right, bottom order."
# Automatic translation.
new "## Die Ränder auf jeder Seite der Schaltfläche, in der Reihenfolge links, oben, rechts, unten."
new "## The borders on each side of the button, in left, top, right, bottom order."
# gui.rpy:158
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
# Automatic translation.
new "## Wenn True, wird das Hintergrundbild gekachelt. Wenn False, wird das Hintergrundbild linear skaliert."
new "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
# gui.rpy:162
old "## The font used by the button."
# Automatic translation.
new "## Die von der Schaltfläche verwendete Schriftart."
new "## The font used by the button."
# gui.rpy:165
old "## The size of the text used by the button."
# Automatic translation.
new "## Die Größe des von der Schaltfläche verwendeten Textes."
new "## The size of the text used by the button."
# gui.rpy:179
old "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
# Automatic translation.
new "## Diese Variablen überschreiben die Einstellungen für verschiedene Arten von Schaltflächen. Bitte lesen Sie in der Gui-Dokumentation nach, welche Arten von Schaltflächen verfügbar sind und wofür sie jeweils verwendet werden."
new "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
# gui.rpy:183
old "## These customizations are used by the default interface:"
# Automatic translation.
new "## Diese Anpassungen werden von der Standardschnittstelle verwendet:"
new "## These customizations are used by the default interface:"
# gui.rpy:198
old "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
# Automatic translation.
new "## Sie können auch Ihre eigenen Anpassungen hinzufügen, indem Sie Variablen mit den richtigen Namen hinzufügen. Zum Beispiel können Sie die folgende Zeile auskommentieren, um die Breite einer Navigationsschaltfläche festzulegen."
new "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
# gui.rpy:205
old "## Choice Buttons"
# Automatic translation.
new "## Auswahltasten"
new "## Choice Buttons"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
# Automatic translation.
new "## Wahltasten werden in den Menüs im Spiel verwendet."
new "## Choice buttons are used in the in-game menus."
# gui.rpy:220
old "## File Slot Buttons"
# Automatic translation.
new "## Datei Slot Schaltflächen"
new "## File Slot Buttons"
# gui.rpy:222
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
# Automatic translation.
new "## Eine Dateislot-Schaltfläche ist eine besondere Art von Schaltfläche. Er enthält ein Miniaturbild und einen Text, der den Inhalt des Speicherplatzes beschreibt. Ein Speicherslot verwendet Bilddateien in gui/button, wie die anderen Arten von Schaltflächen."
new "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
# gui.rpy:226
old "## The save slot button."
# Automatic translation.
new "## Die Schaltfläche \"Slot speichern\"."
new "## The save slot button."
# gui.rpy:234
old "## The width and height of thumbnails used by the save slots."
# Automatic translation.
new "## Die Breite und Höhe der Miniaturbilder, die von den Speicherplätzen verwendet werden."
new "## The width and height of thumbnails used by the save slots."
# gui.rpy:238
old "## The number of columns and rows in the grid of save slots."
# Automatic translation.
new "## Die Anzahl der Spalten und Zeilen im Raster der Speicherplätze."
new "## The number of columns and rows in the grid of save slots."
# gui.rpy:243
old "## Positioning and Spacing"
# Automatic translation.
new "## Positionierung und Abstände"
new "## Positioning and Spacing"
# gui.rpy:245
old "## These variables control the positioning and spacing of various user interface elements."
# Automatic translation.
new "## Diese Variablen steuern die Positionierung und den Abstand der verschiedenen Elemente der Benutzeroberfläche."
new "## These variables control the positioning and spacing of various user interface elements."
# gui.rpy:248
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
# Automatic translation.
new "## Die Position der linken Seite der Navigationstasten, relativ zur linken Seite des Bildschirms."
new "## The position of the left side of the navigation buttons, relative to the left side of the screen."
# gui.rpy:252
old "## The vertical position of the skip indicator."
# Automatic translation.
new "## Die vertikale Position des Überspringungsanzeigers."
new "## The vertical position of the skip indicator."
# gui.rpy:255
old "## The vertical position of the notify screen."
# Automatic translation.
new "## Die vertikale Position des Benachrichtigungsbildschirms."
new "## The vertical position of the notify screen."
# gui.rpy:258
old "## The spacing between menu choices."
# Automatic translation.
new "## Die Abstände zwischen den Menüoptionen."
new "## The spacing between menu choices."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
# Automatic translation.
new "## Schaltflächen im Navigationsbereich des Haupt- und Spielmenüs."
new "## Buttons in the navigation section of the main and game menus."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
# Automatic translation.
new "## Steuert den Abstand zwischen den Einstellungen."
new "## Controls the amount of spacing between preferences."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
# Automatic translation.
new "## Steuert den Abstand zwischen den Einstellungsschaltflächen."
new "## Controls the amount of spacing between preference buttons."
# gui.rpy:270
old "## The spacing between file page buttons."
# Automatic translation.
new "## Der Abstand zwischen den Schaltflächen der Dateiseite."
new "## The spacing between file page buttons."
# gui.rpy:273
old "## The spacing between file slots."
# Automatic translation.
new "## Der Abstand zwischen den Dateislots."
new "## The spacing between file slots."
# gui.rpy:277
old "## Frames"
@@ -337,242 +271,141 @@ translate german strings:
# gui.rpy:279
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# Automatic translation.
new "## Diese Variablen steuern das Aussehen von Frames, die Komponenten der Benutzeroberfläche enthalten können, wenn kein Overlay oder Fenster vorhanden ist."
new "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
# Automatic translation.
new "## Generische Frames, die vom Player-Code eingeführt werden."
new "## Generic frames that are introduced by player code."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
# Automatic translation.
new "## Der Rahmen, der als Teil des Bestätigungsbildschirms verwendet wird."
new "## The frame that is used as part of the confirm screen."
# gui.rpy:288
old "## The frame that is used as part of the skip screen."
# Automatic translation.
new "## Der Rahmen, der als Teil des Überspringungsbildschirms verwendet wird."
new "## The frame that is used as part of the skip screen."
# gui.rpy:291
old "## The frame that is used as part of the notify screen."
# Automatic translation.
new "## Der Rahmen, der als Teil des Benachrichtigungsbildschirms verwendet wird."
new "## The frame that is used as part of the notify screen."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
# Automatic translation.
new "## Sollen Rahmenhintergründe gekachelt werden?"
new "## Should frame backgrounds be tiled?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
# Automatic translation.
new "## Balken, Bildlaufleisten und Schieberegler"
new "## Bars, Scrollbars, and Sliders"
# gui.rpy:300
old "## These control the look and size of bars, scrollbars, and sliders."
# Automatic translation.
new "## Diese steuern das Aussehen und die Größe von Balken, Bildlaufleisten und Schiebereglern."
new "## These control the look and size of bars, scrollbars, and sliders."
# gui.rpy:302
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
# Automatic translation.
new "## Die Standard-GUI verwendet nur Schieberegler und vertikale Bildlaufleisten. Alle anderen Leisten werden nur im vom Ersteller geschriebenen Code verwendet."
new "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
# gui.rpy:305
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
# Automatic translation.
new "## Die Höhe der horizontalen Balken, Bildlaufleisten und Schieberegler. Die Breite der vertikalen Balken, Rollbalken und Schieberegler."
new "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
# gui.rpy:311
old "## True if bar images should be tiled. False if they should be linearly scaled."
# Automatic translation.
new "## True, wenn die Balkenbilder gekachelt werden sollen. False, wenn sie linear skaliert werden sollen."
new "## True if bar images should be tiled. False if they should be linearly scaled."
# gui.rpy:316
old "## Horizontal borders."
# Automatic translation.
new "## Horizontale Grenzen."
new "## Horizontal borders."
# gui.rpy:321
old "## Vertical borders."
# Automatic translation.
new "## Vertikale Ränder."
new "## Vertical borders."
# gui.rpy:326
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
# Automatic translation.
new "## Was man mit nicht scrollbaren Bildlaufleisten in der Benutzeroberfläche macht. \"hide\" blendet sie aus, während \"None\" sie anzeigt."
new "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
# gui.rpy:331
old "## History"
# Automatic translation.
new "## Geschichte"
new "## History"
# gui.rpy:333
old "## The history screen displays dialogue that the player has already dismissed."
# Automatic translation.
new "## Der Verlaufsbildschirm zeigt Dialoge an, die der Spieler bereits verworfen hat."
new "## The history screen displays dialogue that the player has already dismissed."
# gui.rpy:335
old "## The number of blocks of dialogue history Ren'Py will keep."
# Automatic translation.
new "## Die Anzahl der Blöcke des Dialogverlaufs, die Ren'Py behält."
new "## The number of blocks of dialogue history Ren'Py will keep."
# gui.rpy:338
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
# Automatic translation.
new "## Die Höhe eines Eintrags im Verlaufsbildschirm, oder None, um die Höhe auf Kosten der Leistung variabel zu machen."
new "## The height of a history screen entry, or None to make the height variable at the cost of performance."
# gui.rpy:342
old "## The position, width, and alignment of the label giving the name of the speaking character."
# Automatic translation.
new "## Die Position, Breite und Ausrichtung der Beschriftung, die den Namen des sprechenden Zeichens angibt."
new "## The position, width, and alignment of the label giving the name of the speaking character."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
# Automatic translation.
new "## Die Position, Breite und Ausrichtung des Dialogtextes."
new "## The position, width, and alignment of the dialogue text."
# gui.rpy:356
old "## NVL-Mode"
# Automatic translation.
new "## NVL-Modus"
new "## NVL-Mode"
# gui.rpy:358
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
# Automatic translation.
new "## Der NVL-Modus-Bildschirm zeigt den Dialog an, der von den Charakteren im NVL-Modus gesprochen wird."
new "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
# gui.rpy:360
old "## The borders of the background of the NVL-mode background window."
# Automatic translation.
new "## Die Grenzen des Hintergrunds des Hintergrundfensters im NVL-Modus."
new "## The borders of the background of the NVL-mode background window."
# gui.rpy:363
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
# Automatic translation.
new "## Die Höhe eines Eintrags im NVL-Modus. Setzen Sie dies auf None, um die Höhe der Einträge dynamisch anzupassen."
new "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
# gui.rpy:367
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
# Automatic translation.
new "## Der Abstand zwischen NVL-Mode-Einträgen, wenn gui.nvl_height None ist, und zwischen NVL-Mode-Einträgen und einem NVL-Mode-Menü."
new "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
# gui.rpy:384
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
# Automatic translation.
new "## Die Position, Breite und Ausrichtung des nvl_thought-Textes (der Text, der vom nvl_narrator-Zeichen gesprochen wird)."
new "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
# gui.rpy:391
old "## The position of nvl menu_buttons."
# Automatic translation.
new "## Die Position der nvl menu_buttons."
new "## The position of nvl menu_buttons."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# Automatic translation.
new "## Dadurch werden die Schnellschaltflächen größer, damit sie auf Tablets und Handys leichter zu erreichen sind."
new "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# gui.rpy:409
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
# Automatic translation.
new "## Dies ändert die Größe und die Abstände verschiedener GUI-Elemente, um sicherzustellen, dass sie auf Handys gut sichtbar sind."
new "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
# gui.rpy:413
old "## Font sizes."
# Automatic translation.
new "## Schriftgrößen."
new "## Font sizes."
# gui.rpy:421
old "## Adjust the location of the textbox."
# Automatic translation.
new "## Passen Sie die Position des Textfeldes an."
new "## Adjust the location of the textbox."
# gui.rpy:427
old "## Change the size and spacing of items in the game menu."
# Automatic translation.
new "## Ändern Sie die Größe und die Abstände der Elemente im Spielmenü."
new "## Change the size and spacing of items in the game menu."
# gui.rpy:436
old "## File button layout."
# Automatic translation.
new "## Layout der Schaltfläche Datei."
new "## File button layout."
# gui.rpy:440
old "## NVL-mode."
# Automatic translation.
new "## NVL-Modus."
new "## NVL-mode."
# gui.rpy:456
old "## Quick buttons."
new "## Quick buttons."
translate german strings:
# gui/game/gui.rpy:5
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
# Automatic translation.
new "## Die Anweisung init offset bewirkt, dass die Initialisierungsanweisungen in dieser Datei vor den init-Anweisungen in allen anderen Dateien ausgeführt werden."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
# Automatic translation.
new "## Prüfungen auf ungültige oder instabile Eigenschaften in Bildschirmen oder Transformationen aktivieren"
# gui/game/gui.rpy:19
old "## GUI Configuration Variables"
# Automatic translation.
new "## GUI-Konfigurationsvariablen"
# gui/game/gui.rpy:167
old "## The color of button text in various states."
# Automatic translation.
new "## Die Farbe des Schaltflächentextes in verschiedenen Zuständen."
# gui/game/gui.rpy:173
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
# Automatic translation.
new "## Die horizontale Ausrichtung des Schaltflächentextes. (0.0 ist links, 0.5 ist mittig, 1.0 ist rechts)."
# gui/game/gui.rpy:278
old "## The position of the main menu text."
# Automatic translation.
new "## Die Position des Hauptmenütextes."
# gui/game/gui.rpy:287
old "## Generic frames."
# Automatic translation.
new "## Allgemeine Rahmen."
# gui/game/gui.rpy:307
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
# Automatic translation.
new "## Die Standard-GUI verwendet nur Schieberegler und vertikale Bildlaufleisten. Alle anderen Leisten werden nur in vom Ersteller geschriebenen Bildschirmen verwendet."
# gui/game/gui.rpy:368
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
# Automatic translation.
new "## Die maximale Anzahl der Einträge im NVL-Modus, die Ren'Py anzeigt. Wenn mehr Einträge als diese Zahl angezeigt werden sollen, wird der älteste Eintrag entfernt."
# gui/game/gui.rpy:405
old "## Localization"
# Automatic translation.
new "## Lokalisierung"
# gui/game/gui.rpy:407
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# Automatic translation.
new "## Dies steuert, wo ein Zeilenumbruch zulässig ist. Der Standardwert ist für die meisten Sprachen geeignet. Eine Liste der verfügbaren Werte finden Sie unter https://www.renpy.org/doc/html/style_properties.html#style-property-language."
# gui/game/gui.rpy:415
old "## Mobile devices"
# Automatic translation.
new "## Mobile Geräte"
# gui/game/gui.rpy:446
old "## Change the size and spacing of various things."
# Automatic translation.
new "## Ändern Sie die Größe und die Abstände verschiedener Dinge."

Some files were not shown because too many files have changed in this diff Show More