Assimp was contributing a lot of to the size of Ren'Py, so put it on a
diet and removed all the formats except for GLTF). This would also let
us switch toanother GLTF parser in the future.
Despite Ren'Py supporting it, scaling images down (except when the
window is scaled) is somewhat rare. So instead of generating a lot of
mipmaps that will not be used, we only opt in automatically if the
window itself is scaled down, and otherwise leave the decision to
the creator.
This prevents long loading times by preloading AssimpModel objects
from disk when required.
As part of this, the idea of a callback is dropped, and renders of
textures happen when the displayable is rendered. This creates all
Renders in the main thread, which makes Render mark-sweep reliable.
Directory mentioned before the Namespace.
Made more newbies friendly, and moved more to the top of the docs.
This is consistent with the Doc page on Displaying Images.
This makes all the matrices we need available in uniforms. The reason
for u_transform and u_cameraview is both to make these available for
further processing in Program.missing.
In older versions of Cython, the `for` loop syntax `for 0 <= i < n:`
was used. This has been replaced with the more Pythonic
`for i in range(n):` syntax, which the Cyright tool handles better.
Both syntaxes are optimized in modern Cython.
I felt like the discrepancy between "transparent pixel" and "transparent black" was confusing. This seems much clearer and hopefully technically correct.
Running all the cython tasks in parallel at once is a bit violent. On my Docker
container for instance, it makes some processes be killed before they complete
because of resources exhaustion.
Using a ThreadPoolExecutor instance to limit the number of parallel tasks
guarantees there will be at least as much processes at the number of CPU plus 4
(up to 32) so that should be as fast as before without risking to reach the
host resources limit.
this should fix#6087 (dragging of nested viewports).
however, i don't see a way to fix scrolling of nested viewports via mousewheel also, now that a viewport is no longer focusable with a mouse/touch screen(rv.add_focus(self, renpy.display.render.Render.NO_MOUSE_FOCUS, 0, 0, width, height)).
on the other hand, i don't know if that would be very practical at all. so currently only the outer viewport makes use of the mouseweel property.
The built-in reset transform will now reset all transform properties
rather than only a small subset. This makes it more predictable (no more
guessing which properties it will reset) and also future proof as it no
longer requires being kept up to date as an explicit definition.
This was previously used to make allowances for Windows 7 and below,
however those conditions have been dropped along with Windows 7 support
and so there's no need to keep this function around.
If flag files, game/libs/libs.txt and game/mods/mods.txt exist.
In both cases, the files in the directory load in unicode order by
filename, and not by full path. Files in game/libs load before other
files in game, while those in game/mods load after other files in
games.
The main reason for this is to support CDSes that are distributed
in libraries. A CDS in game/libs/cds.rpy can be used in any file
in the main game.
Similarly, mods son't affect the parsing of the main game.
Per #6049.
If the import machinery is present, Python will try to use it when
loading lines for a traceback. This would lead to the wrong line
being shown in tracebacks.
The biggest one is that once a translation has been seen, dialogue
statemments inside that translation are also marked as seen.
This change also changes the representation of seen translates and
nodes, to store a 64-bit hash of the identifier, which should take
up less memory and should be able to be pickled faster.
Fixes and issue where, when the next video frame is not ready, the previous one is returned by get_movie_texture_web(). Normally, this is just a GLTexture instance, but when using a mask, that frame is a Render instance instead. The problem is that Render instances get killed soon after they have been drawn, so get_movie_texture_web() returns a dead instance when re-using the previous frame which causes a crash because of missing uniforms when drawing the screen.
Fixes#6050.
By doing this, it's no longer to keep the name tuples materialized
all the time. Instead, the AST store this information, which should
reduced memory usage (at the cost of some CPU time).
The motivation for this is to reduce the memory used by PyExprs
Previously, a PyExpr needed to point to an int object for the line
number (8 bytes for the pointer, 28 bytes for the int), and another for the
Python version. (8 bytes for the pointer.)
Now, the line number is stored in 4 bytes, and the Python version in
1. Even with 4 bytes for the hashcode, this drops from 44 to 12 bytes
of overhead.
There's also another 16 bytes saved by disabling cyclic gc.
Previously, the bytecode cache had a lot of duplication, with
PyCode and PyExpr blocks being treated differently. With this
change, the same cache is used for both.
By storing fnv1a hashcodes on both objects, looking up the bytecode
in the py_compile cache should be fast, and so the second path to
hash and cahe PyCodes isn't required.
This required marking class variables with ClassVar.
Most __new__ methods have been eliminated, as they would duplicate
the default information now contained by cslots.
Calling an instance of ATLTransform acts on the child, which if none is
passed, is self.child. This isn't desired in cases where we're about to
inject a new child, so instead provide the child as a parameter.
Additionally we pre-emptively call _unique on the child to forestall any
_duplicate attempts during the construction of the transform.
Cyclic GC imposes a 16 byte overhead on each object. Instead of
cyclic GC, we have a ._kill() method that clears the references
from each object, and rely on Ren'Py to call it to break cycles
when it's time for the Script to be deallocated.
Previously, setup.py had been the main build process, and would
probe the system for dependencies. Now that all dependencies are
available on all platforms, and cross-compiling is done by renpy-build,
setup.py has been simplified by assuming everything is present.
(Optional probing is done using pkg-config.)
Various includes have been changed to be more canonical.
This directory contained a mix of both c/cython source code, scripts,
and build information. Now, source is in src, scripts are in scripts,
and setup.py is in the root.
Per discord discussion, this makes it possible to take a screenshot
before an in-game menu is shown, and use that screenshot when entering
the menu context.
If a file named ``no_launcher_links.txt`` exists in the Ren'Py base directory (the one with
renpy.exe, renpy.sh, and renpy.app in it), the launcher will disable links to renpy.org. While
not guaranteed, this is intended in educational and homeschool environments to prevent young
Ren'Py users from seeing adult sponsors.
If a file named ``no_launcher_links.txt`` exists in the Ren'Py base directory (the one with
renpy.exe, renpy.sh, and renpy.app in it), the launcher will disable links to renpy.org. While
not guaranteed, this is intended in educational and homeschool environments to prevent young
Ren'Py users from seeing adult sponsors.
Updates thumb_offset to optionally take a tuple instead of an integer. If provided a tuple, the first number is used to offset the left/top of the bar, and the second number is used for the right/bottom. This is helpful for bars whose thumb is asymmetrical, such as a half-circle. In particular, it avoids issues with semi-transparent image overlap (in general or when using ATL or transitions). It is backwards-compatible with the regular integer value.
Adds a thumb_align property to bars. This solves an incredibly common issue which occurs when the bar's thumb is larger than the bar images. Most people want the center and thumb of the bar to be aligned. This provides a simple in-engine solution, rather than forcing players to adjust their bar images in an image editor.
The strategy chosen was to keep track of which slots have had
information by the rest of Ren'Py, and only restarting if one of
those slots is accessed.
This is motivated by a series of interaction restarts at choice menus,
caused by the autosaves that happen when a choice menu is reached.
The strategy chosen was to keep track of which slots have had
information by the rest of Ren'Py, and only restarting if one of
those slots is accessed.
This is motivated by a series of interaction restarts at choice menus,
caused by the autosaves that happen when a choice menu is reached.
Specifically, before doing any sort of keyboard focus, check
that the current focus supports the keyboard, and drop it if
it does.
Per #5936. Keeps the fix for #5173.
Specifically, before doing any sort of keyboard focus, check
that the current focus supports the keyboard, and drop it if
it does.
Per #5936. Keeps the fix for #5173.
As requested in #5948.
Thought was given to doing something similar with file_slots, but
that would require multiple new styles, and it's generally a bigger
lift when it comes to customization.
In the "Tutorial" > "Transforms and Animation", there is a section that demonstrated that `repeat` can take an integer argument.
However, the `alt_image1` example code is shown twice on lines 543 and 548 for two different examples.
Line 548, should be changed to show the `alt_image2` example code which removed the `repeat 2` line from the previous example, showing that the animation will only happen once.
In the "Tutorial" > "Transforms and Animation", there is a section that demonstrated that `repeat` can take an integer argument.
However, the `alt_image1` example code is shown twice on lines 543 and 548 for two different examples.
Line 548, should be changed to show the `alt_image2` example code which removed the `repeat 2` line from the previous example, showing that the animation will only happen once.
Fixes#5905.
The underlying issue was caused by the screen being run for a
second time in SHOW mode, which in turn prevented scopes of used
screens from being saved.
When render_tree is None, screenshot takes the old contents of
the framebuffer. Which isn't great, but since it happens when
at the main menu, isn't a huge deal.
Fixes#5879.
Rounding errors could cause problems when performing the pixel
perfect correction, and the rounding errors could be different
in normal rendering and render-to-texture.
By rounding first, we eliminate these problems.
Fixes#5844.
The failure would take place in the case where a channel is changed
between roll-forward and and an interaction, but the sound playing
would not change (ie. a queue operation).
This prevents an issue from occurring when a non-duplicatable
displayable is the child of multiple other displayables, which
could set transform_event multiple times.
As it doesn't respond to the event, and doesn't produce it, there's
no reason for the event to be stored. So we don't.
Fixes#5788
i don't think labels, images and audio files should be marked as seen in replays. basically all other variables are local to that context.
for instance developer would be able now to temporarily unlock content of a replay gallery for higher tier patrons without actually changing the seen status of a label.
to preserve the old behavior one can set the new config var to True.
This stores the area of the crop box, and lets a displayable go
outside its parents so long as it goes outside the crop box.
(Not 100% sure why this is working without changes when the
displayable is out to the right, but so far so good.)
* Do not call syncfs() twice in save_persistent()
With Ren'Py default config, MultiLocation.save_persistent() will call
save_persistent() on 2 different instances of FileLocation. They both
call synfc(), so the warning message "2 FS.syncfs operations in flight
at once, probably just doing extra work" shows up. This commit prevents
that.
* Create and use a context for syncfs pause
* Only call syncfs once from MultiLocation functions
This should handle all the functions of MultiLocation that call
functions of FileLocation that call syncfs().
* Do not call syncfs() twice in save_persistent()
With Ren'Py default config, MultiLocation.save_persistent() will call
save_persistent() on 2 different instances of FileLocation. They both
call synfc(), so the warning message "2 FS.syncfs operations in flight
at once, probably just doing extra work" shows up. This commit prevents
that.
* Create and use a context for syncfs pause
* Only call syncfs once from MultiLocation functions
This should handle all the functions of MultiLocation that call
functions of FileLocation that call syncfs().
Fixes#5701.
That was caused by a transform that ran in the normal path, but
was skipped during rollback. As the skipped transform never updated
its state, the outcome was visually different.
This is because during the init phase, deferred translations
haven't been loaded. This leads to two cases:
1) The game is in the None language, and so everything is awesome.
2) The game is in another language, in which case Text.per_interact
will re-translate the text, and everything becomes awesome.
Fixes#5713.
This had been using get_screen, which considered both tag and
screen name. This means that when the bubble screen was shown
as _retain_0, and the bubble screen was shown, the instance
with retain_0 would be found, causing problems.
Fixes#5715.
This is a more principled implementation than we had before. Syncro
start now consists of audio about to play being delayed until:
* All audio about to play with the synchro_start flag set is
ready to play. (Has samples decoded.)
* There is no queued audio with the synchro_start flag set.
This is intended to help with textshaders, as it means that any
textshader should have long completed before time 0, preventing it
from happening at time 0.
Fixes#5685.
Previous versions of Ren'Py could expand a displayable by cropping
it, which makes no sense. This version limits the size of the
cropped displayable to the intersection of the crop box and
displayable.
This has compatibility with the 8.2 and pre-8.2 behaviors.
DynamicImages would not be marked unique before the first execution,
which is wrong.
The change in slast is to fix a missing _unique call on the creation
of an unaliased displayable.
Fixes#5659.
This is done by making the boxes change behavior when the justify
or align is given, to not supply extra space to the placements
like xfill and yfill usually do.
This moves alignment and justification to a second pass, when the
size of each placement is fully known. This seems better than trying
to place each with partial information and then correcting it.
As a change, box_align and box_justify no longer imply xfill or
yfill. This follows how Text works, where justify and align
occur inside a small text size.
Interestingly enough, Lint will also not report spelling mistakes in dialogue, snake case in class names, or your stash of downloaded movies to the authorities. The more you know.
I would put it in transform properties, to balance the length of the two pages
but existing links to the Warpers section will survive this way (once the redirect is put in place)
and it would be the only part not directly related to transform properties
This:
* Is available outside of developer mode.
* Shows the current line number.
* If a translation is in use, shows the source line number.
* If a translation is in use, shows the translated line.
Fixes#5414.
This returns an object containing information about a translation
or the default text corresponding to the translation, including
the source, filename, and line number.
Per #5414.
This prevents errors from accumulating and causing glitches. The grid
is 1/100th of a pixel, which should allow for subpixel movement without
too many problems.
Fixes#5632
The rpu updater didn't save the state during an update, causing
Ren'Py not update files it installed. That was fixed in
05bfde75e3, and this deals with
the fallout by adding the missing dlc as required.
When `config.web_video_base` is set with an absolute URL to another origin,
modern browsers won't load the video with an error:
> The HTMLMediaElement passed to createMediaElementSource has a cross-origin resource, the node will output silence.
For CORS to work:
1. The server serving the resources should have a `access-control-allow-origin: *` header.
2. The `video` element should have `crossorigin="anonymous"` attribute.
With a list of rules for deprecated and non-deprecated names.
The origin of all Ren'Py-sourced names is "renpy", and then this
is changed to "deprecated" if a rule hits.
* RPE files are now searched for in config.renpy_base as well as
the game directory, to make it easy for the user to install
.rpes.
* .rpe.py files are searched for in the same places, and loaded at
the same time.
fixed auto translations and some other translations where necessary and changed formal speech into informal speech, because it is more natural and usually shorter
the legacy constructor is not used anymore, the positional property either.
extrapos and extrakw returned the name of the parameter instead of the object itself, that's useless
also reimplement the atl commented code that was using it - there needs to be clarity between parameter objects and names
Adresses most of the main points of #5102, and #4371.
The parameters that get fixed are still forbidden though, as are var-pos and var-kw parameters. That will be for another PR. But the implementation that goes with handling those is already here, commented-out for performance.
The solution to #4405 is there too but also commented out. That change will also go in separately.
Fixes#5569.
This works by deferring the screenshot until after an immediate
interaction restart, and adding actions that can be run before
this restart.
As part of this, the precise timing of renpy.invoke_in_main_thread
handing is adjusted. Since that wasn't ever defined, this seems fine.
This is a really poorly named callback that has little purpose
(other than saving jsondbs) as it runs between when the game
store has been loaded and when the init data is removed.
This is a really poorly named callback that has little purpose
(other than saving jsondbs) as it runs between when the game
store has been loaded and when the init data is removed.
Queuing up allow multiple messages with renpy.alt to be queued up
before the next tts. And this fix allows renpy.alt(force=True) to
work where it had been broken.
Fixes#5545.
This fixes a problem where:
label start:
"A"
$ pass
label b1:
label b2:
label b3:
label b4:
label b5:
label b6:
label b7:
label b8:
label b9:
"B"
Would create a Rollback for each of the labels, depleting the rollback
log space. The practical version of this involves many calls and returns.
Fixes#5406.
This makes it possible to have the mesh render depend on
texture displayables, which will allow the mesh displayable
to change if the texture displayable animates.
importing __future__ is not strictly necessary as the imported values of division and with_statement could be used directly, but I think it's preferable to separate the future statement from the future import.
actually, arbitrary kwargs are a very bad thing to pass since as long as the specified screen exists (so, unless something is very wrong), they are just ignored
the scope's default value change is benign as long as we don't do stupid things with it and continue to call dict() on it - and it prevents stupid things we might do to it in the future to go unseen
a character is something in renpy (and in renpy dialogue), calling it a unicode character, while not particularly relevant otherwise, helps clarification
internal links = gud, x2
textshader is a tag, text shader is the feature
you can't create an entire text shader out of string interpolation - or I would be very surprised - what you can create is a textshader tag which is nice enough
These have the form u__var, and expand to u_textshader_name_var,
though are intended to be used as positional-only in most cases.
A way of preventing uniform conflicts.
The slow duration is 1 / slow_cps, or 0 if slow text is not active.
It's available in the shader, to make effects scalable by the
duration. It's also available as a multiplier that can be used
to add to extra_time.
* Uniforms are checked for existence.
* The u_ prefix is no longer mandatory.
* It's possible to specify a default uniform that's used if no
uniform name is given.
Several changes to provide an API for the textshader system.
Add the renpy.register_textshader function.
Add config.default_textshader. This is a shader that is combined with
other textshaders, generally to provide the slow text effect while
the other textshader provides more complicated effects.
This is mostly intended for use in VS Code and similar environments.
When an exception happens, this will propagate it through Ren'Py,
allowing the debugger to inspect the state of the game.
This moves the conversion of positions to texture coordinates
to glyph_coordinates, where it's faster.
This also stores information about RTL and duration into
each glyph, which is then used to figure out the duration
of each glyph.
Finally, the mesh is created when it doesn't exist already,
and stored in the layout.
This is going to be used when computing the text mesh, to expand
the bounding boxes of each glyph when outside the (width, line_spacing)
default bounding box.
The window hide/show statements no longer disable the window auto
flag, with new statements (window auto True, window auto False)
taking care of that.
The thinking behind this is that window hide is useful in it's own
right, but significantly less useful if it requires a matching
window auto each time.
For example, one might want to do:
e "Dialogue"
window hide
show clouds with dissolve
e "Dialogue"
and have that work.
The two had been largely independent. The result of these changes
is that nvl operations now adjust the window show/hide state, while
the nvl <-> adv transitions won't happen if the window is hidden.
If the window is hidden, then window show will happen instead.
This handles uploading filters to the web audio system, identified by
numeric ids. It can also then plumb those filters in to the rest of
the system, allowing them to be used to filter audio.
Finally this adds the Biquad filter.
This change causes Ren'Py to scan for a file named exec.py, and if
found, run it.
This is intended to enable certain kinds of tools, like #5455, and
probably a bunch I haven't thought of, like debuggers.
Security:
I don't think this has security implications. It requires writing
exec.py into config.basedir. If you can do that, you can write
renpy.sh or renpy.exe. There's also a good chance you'd have
permissions to write into game/ or lib/.
So, it's basically letting you do something you could do anyway,
without restarting the game.
This fixes an issue I caught myself where trying to slice inside an
interpolation would cause an error, because:
"[l[:100]]"
would be parsed as an expression of l[ and a format string of
:100], which is wrong.
This simply copies input to output.
By adding this, it's now possible to be sure that (in filter.pyx,
_not_ renpysound), an AudioFilter will never be None. This in turns
removes a lot of special casing.
This is similar to the way music fades out by default - by using
one frame to crossfade the audio filter, leveles change relatively
slowly and a pop is avoided.
* SequenceFilter is a filter that takes multiple filters as
children, and pipelines them in sequence.
* to_audio_filter turns lists into SequenceFilters, and typechecks.
* The check_subchannels methods make sure that audio filters are
compatible.
This converts the sound to float, and sends it to the audio filter
before mixing. This also includes the initial implementation of the
AudioFilters, using SoundBuffers to store the audio.
Ren'py 8 still has all the code needed to support these files, but
as the ast module of python has changed between 2.7 and 3.9 it becamse
impossible to even load these files as the unpickling process would error
due to unknown classes. This means nearly any ren'py 6.17 game cannot be ported
over without a recompile.
This commit fixes this by intercepting the construction of these classes
using pre-existing mechanisms in renpy.compat.pickle. When not needed this
adds only a single equality check to the critical path of unpickling files.
So one can write FieldValue(persistent, "option", min=1.0, max=5.0)
rather than FieldValue(persistent, "option", range=4.0, offset=1.0),
which is a bit harder to read.
The keyboard_focus_insets style property makes it possible to
have keyboard focus work with overlapping buttons, by artificially reducing
the size of the buttons to remove the overlap, when determining keyboard focus.
Closes#4620.
This makes it much more straightforward to get the vertical metrics,
when those are required.
Harfbuzz seems to place underlines a bit differently, but since it
doesn't look bad, this is acceptable.
Most notably, x_offset was used for both harfbuzz's offsets, and
for the amount that Ren'Py adjusted text to match drawable to
virtual layout.
Also make clear that the names refer to horizontal text, and
are reversed for vertical text.
It's possible to have an an image (in this case, a layered image)
that isn't complete at runtime, but is at runtime. These shouldn't
cause errors when unknown attributes are used - that's the creator's
problem.
Names that Ren'Py uses in other places (like image) are illegal
becase those names are keywords, when there's no need to be. So
this removes most keywords, and makes other words only keywords
when used in image specifiers.
This is largely informed by the way the language has been evolving
to mostly use Python names as keywords, and also by the way Python
now has some soft keywords.
Per #5366.
In the various layer transform functions. This is a speedup, and also
a somewhat hacky fix - as it means the transform will be used, rather
than copied, and hence the state available to be propagated.
Fixes#5358.
In the various layer transform functions. This is a speedup, and also
a somewhat hacky fix - as it means the transform will be used, rather
than copied, and hence the state available to be propagated.
Fixes#5358.
Unoptimized means that we don't have transparent pixels cropped
out. This is the format live2d expects, and so using it will
ensure that the texture can be used directly avoiding a
render-to-texture.
Unoptimized means that we don't have transparent pixels cropped
out. This is the format live2d expects, and so using it will
ensure that the texture can be used directly avoiding a
render-to-texture.
This ensures that Ren'Py will be able to load all Live2D textures
that the game uses at full resolution, provided the system supports
that.
Fixes#5293.
This was only used for building Ren'Py, and mostly used because
building atom took forever. With RPU updates, this causes problems,
so I'm removing it.
Fixes#5315.
None as an anchorangle wasn't supported (it fails at the setter phase in an expectable way).
The use in atl.py was simplified before, then undone for reasons of git revert only.
Once the hard_rollback_limit is exceeded, hard checkpoints are added to
the number of blocked checkpoints, ensuring that when totalled limit and
block counts total the number of hard checkpoints currently in the log.
Now that the entire log is counted, it makes it safe to count hard
checkpoints out of the log, first from the blocked count, and then from
the limit count, never dropping below zero.
By calling up to the Say class which holds the logic for dealing with
say attributes and other aspects of Say statements which we need to
proxy though.
As we pop from the end of the log we decrement the limit until it is
exhausted, before continuing to decrement the block count as further
entries are popped in an effort to find a place to end rollback.
Use urllib functions to ensure file urls are quoted properly.
Remove the schinese url, because it can overwrite the main URL, and
it'll be rarely used now.
The new config.layer_transforms variable allows you to supply
a list of transforms that will be applied to all layers, or to the
combination of all layers in config.layers.
The intent is to prevent people from having to repeat transforms
in camera statements.
Fixes#4562.
In the case where:
* A new Rollback begins.
* A variable has it's value changed.
* A new context is created, with rollback disabled.
* The variable is made dynamic.
* The variable is set back to it's original value.
* A Rollback is completed.
It would be possible to have a variable that was set and not rolled
back. To fix this, the Rollback is completed on entering a context,
and a rollback can be completed multiple times.
This manifested on _side_image_attributes, so this adresses #5242
and #5207.
DualAngle.from_any is already dualangle_or_float, and anchorangles (if not None) cannot be a tuple of None, it can only be a tuple of float (from older versions of renpy) or DualAngle
ALIASES's values were never read, because the only read values of PROPERTIES are those also present in diff2_properties or diff4_properties, both of which are only populated by add_property
Even if the same screen is shown again. This makes it possible to use
transform events with screens that may be shown again immediately,
like the say or bubble screens.
The issue was that tts would read the modal screen and everything
below it, not above it. (This had to do with the change in order
for layers a while back.)
This fixes#4999 while trying to keep #4834 fixed. There is a
very minor behavior changes here:
When a screen has been called, renpy.showing will not return
true for a screen's name if the screen has a tag.
This seems fine, because renpy.showing is only documented to work
with tags, not names - working with screens by name has been the
job of renpy.get_screen. So it's only a change to undocumented
behavior.
This was always the case for normal images, but screens pass the
screen name as name. This could cause a problem (#4999), where
a transient screen going away would leave the tag (but see the next
commit.)
This adds support for re-running default statements in the special
namespaces, and then enables that for persistent. It also adds a
call to renpy.execute_default_statement in persistent._clear.
Per #5000.
* Move away from Formatter for string interpolation
As we were already overriding the C parser, the only advantage we were
taking advantage of was the C field name parser. We continue to use this
but by moving away from the string.Formatter template we can ignore
a bunch of things that we aren't interested in (such as which fields
from the supplied scope were used).
* Whitespace
* Manage conversion flags with sets
* Update interpolation parser to support expressions
This change allows strings and nested brackets, braces, and parens to be
within an interpolation without breaking out. It also allows conversions
to be specified before the format (in line with Python), with graceful
fallback to ensure existing interpolations continue to work as intended.
* Treat interpolation as Python expressions
* Add support for debug interpolations
This apes fstring functionality where a trailing = symbol is used to
denote that the expression part of an interpolation should be included
with the output and, when no conversion or format are specified, imply
the result should be run through repr.
* Update interpolation documentation for expressions
* Add interpolation expressions to changelog
* Change the type of xanchoraround and yanchoraround
* Try to implement anchoraround
* Avoid calling position_or_none at all
type(spline[-1]) comes from before 5123
It should work until a deeper examination completely clears the issue.
* DualAngle solution to the mixed-types polar anchor system
* Factorize the common end part of the setters
* Factorize the common first part of the getters
* Allow the common first part to be cached/skipped
* Hasten set_anchorradius without slowing down set_anchorangle
* Kick out the former helper functions
* Inner documentation
* Convert polar pos to using absolute and positions without double angles
Basically reuse the architecture from polar anchor, but convert everything to absolute as soon as possible and avoid duplicating everything (including the angle) between an absolute and a relative metric.
I think the issue could have been solved by removing the "divisor" thing and have absolutes always returned, but I'm not sure.
To be tested, maybe the divisor thing was necessary for interpolations of pos inside a container of interpolated size.
* Simplify calculations when the polar vector is 0
The exact same skip can't be done for anchor, because the two radii are independent and the get_anchorradius calculates them both
feature: search control before initialization
Currently, the search can be modified, but the initial initialization of the archives is done with the initial paths.
This fixes issues with fullscreen, especially on mobile platforms
where the device can rotate while fullscreen is enabled. At the
same time, Ren'Py has been handling web-resize well.
So, we simply requestFullscreen on the html element, and let it
bring the window fullscreen, resizing the canvas as it does so.
This is necessary so they can be counted out as the log is truncated,
keeping rollback_limit accurate. This results in correct reporting from
renpy.can_rollback in the scenario where config.rollback_length has been
exceeded.
This interns certain common strings to save memory. Interned are
Lexer.names (which will get things like image attributes), and
simple cases of Say.who.
Per #3759.
This reuses portions of the gui mechanism, but only updates the
most basic information, like the title and save directory, as
well as the translation-relate information.
A focusable viewport will steal focus from its children, which
is a problem for keyboard and gamepad nav. So now we have
grabbble-only viewportsm which fix the problem.
Fixes#5173.
This is a transition that is run between the scene show and hide
statements, and other statements, if there is not intervening
with statement. This allows transitions to be created to run
when images are shown.
Per #2064, needs to be documented.
This is due to several problems that don't seem to occur on other
browsers. While the visibility problems were patched away, once
we went fullscreen, it was impossible to show anything else, like
the web_input textbox.
After a weekend working on it, no luck - so Fullscreen is disabled.
Fixes#5038.
The name is quater, Gamma-quater
The commented lines only waste execution time until all kinds of parameters are allowed, but they are intended to be included when all parameters are.
* Make the per-character stats optional, but use the complete
version when there.
* Make the problem lists less humanized, and easier to scan by
lining things up vertically.
* Convert ParameterInfo to an inspect subclass, adapt parsing
* Prettier repr for screens
Include the (pretty !) signature in the repr.
The default values are not themselves but the strings evaling to them - but who cares
* Monkeypatch ATL just enough for it to work
use .items() bc it's now a dict, access the default value the new way, and account for Parameter.empty
* Reimplement apply in a much better way
The default values are now evaluated lazily, only when needed, which is both faster and closer to the previous behavior.
The implementation of ignore_errors is not as good, but that should get improved soon.
Performances of the apply call on autorange goes from 50k-.30 to 100k-.32, which is almost a 2x speedup
The legacy apply call is at 100k-.23, we're dragging 40% slower but closing
* Copy and tweak Signature._bind to further improve perfs
apply call's autorange is now 100k-.29, so 26% slower than the former implem
we now manage the _ignore_extra_kwargs special kwarg behavior, forgotten until now
Having all the different raised exceptions now opens the door to ignoring errors all we like
* Realy implement ignore_errors
* Hasten legacy constructor and use empty uniformly
There are pros and cons of using empty or None, only one should be used (especially since now we control unpickling and binding) but let's decide that later
* Fix ignore_errors
* Simplify None barrier and avoid kwargs mutations
* Break free from inspect, make compat for py2, tweak stuff
* Rename the class to prevent unpickling on older versions
* Rephrase signature parsing errors
* Fix : allow defaulted and required kw-only in any order
and comments
* Simplify some code now that Parameter.empty is None
* Improve pyanalysis
extrapos and extrakw are now part of the list (actually dict keys) parameters
while that code would not yield exceptions, it added the same names twice which is a waste of time
* Fix and improve lint parameters check
p[0] gave the first letter of each parameter name, which invalidated the whole test
also, as with previous, extrakw and extrapos are part of the normal list of parameters
And as a bonus, separate the check for renpy and for python internals, making the report more understandable
* Mark ATL transform as needing reform
the only remaining use of extrapos and extrakw after which the properties can be removed from the Signature class
* Fix signature equality
dict equality didn't test ordering
* Hasten Signature equality
Theoretically signatures with different kw-only orderings should be considered equivalent,
but their repr is different, and no part of renpy optimizes over that
and our Signature is not hashable, so who cares, this is faster
* Patch dict ordering for py2
Otherwise a signature pickled in py3 and resurrected in py2 would have arbitrary ordering
* Todo for the future
* Remove unnecessary method
* Only report the first pos-only parameter
showing all of them in a row was bulky on the report
* Print the invalid parameters
This speeds up the start of games with large numbers of
translations, by deferring the loading of a game's
translation scripts until the language is selected.
The downside is that these scripts are loaded out of order, but
that seems like a small price to pay for the speed boost that
can be provided.
* Fix the start x/y
* Keep the grab x/y accessible in the drop/dragged callbacks
* Can also fetch drags by name
* Documentation
* Clicked callback passes the Drag
* Can reset last_drop at the start
* Fix a typo for the drag docs
* Snap takes a warper
* More documentation
* Disallow dropping while drag is snapping
* Fixes for getting a drag by name
* Convert callable to a run call
* Add snapped callback
* Add the snapped property
* Document last_drop
* Update description
---------
Co-authored-by: Tom Rothamel <pytom@bishoujo.us>
This is a performance improvement to focus_mask, especially in
the case where where the bounding of non-transparenty pixels is
small relative to the size of the imagebutton. In that case, the
GPU is only invoked when inside the bounding box.
This prevents expensive round trips to the GPU when we're sure
those operations will be unproductive.
Per #3612.
This is inspired by #5152, where a large number of crashes were
caused by an issue that was fixed in GL2.
The only reason to keep GL1 in is that we promised another release
with it, but it doesn't need to be easy to use.
Add a new position type, representing the sum of an absolute position (a current int or absolute) and a relative position (a current float).
See #5013 for the rationale. Closes#5103.
The change to str.capitalize over str.upper was to cover the case of
digraphs such as "nj" (see pydoc ref). However the remainder of the
string should remain untouched per our docs, with full str.capitalize
parity being achieved by combining the l and c conversions.
Use of capitalize does swap one quirk with another: Previously "NJ", "Nj",
and "nj" would all become "NJ"; now they will all become "Nj". The
potential down casing of the constituent J of the upper case form ends
up being a better trade off than the up casing of the J from the two
latter forms, especially within the context of the c conversion.
ref: https://docs.python.org/3/library/stdtypes.html#str.capitalize
This specifies a group prefix that is spoken the first time a
displayable with the first group prefix is spoke, but won't
be spoken again until a displayable with a different group
prefix is spoken.
Previously, if selected_alt was set for a button, Ren'Py would
say "<whatever> selected." Now it will only say that if selected_alt
is the same as hover_alt.
Since iOS 13, Safari uses the desktop mode by default on iPad which removes
the "iPad" string from the User-Agent header. The new detection looks for
an Apple product with touch enabled (there is no MacOS product with touch
screens AFAIK).
Or more specifically, non-maximization - the test would occur
only when the window was resized, and on Linux that can happen
before the maximize flag is removed.
And restore it when the game restarts, assuming the display
configuration remains the same.
This also trusts the stored window size when the display
configuration remains the same - on the grounds that if it worked
in the past, it'll work in the future.
Or more specifically, non-maximization - the test would occur
only when the window was resized, and on Linux that can happen
before the maximize flag is removed.
Text that's marked with SPLIT_IGNORE (the unicode
CL and CP classes) is text that isn't considered for the
purpose of the linebreaking algorithm. These characters tend to
be CJK punctuation and close parenthesis.
SPLIT_IGNORE text doesn't have it's size taken into account when at
the end of a line. This keeps the layout the same visual width, rather
than breaking a character and it's punctuation on the next line.
Fixes#3356, except for ー , though renpy.language_tailor could be
used to change the break class of that character if desired.
On macOS a file with the quarantine flag will cause an error on game start:
```
error: unrecognized arguments: -psn_0_some_number_here
```
Unfortunately the end user has no control over how the renpy engine is packaged
and/or embedded. Thus let's ignore this argument.
The problem was that segements weren't being handled properly,
which meant that the created update was corrupt.
Also, remove test harness that hasn't been used in a while.
Specifically, until after the update method has been selected, and
for rpu, after the files have been scanned and the size of the
download is known.
This will (shortly) let us give the user information about
download and disk size.
* factorize the most common BarValue subclasses, using the same recipe (but in a much simpler way) as in Action mixins #4473, which considerably shortens the code and avoids code duplication
* fix the kind parameter of FieldValue and VariableValue - it was saved but never passed to _get_field and _set_field
* fix some subclasses doc entries that weren't appropriately worded, some which set variables mentioned "fields"
* implement LocalVariableValue, supersede and fix add the LocalVariableValue action #5055, and allow it to have adequately-worded exceptions
Co-authored-by: Mal Graty <mal.graty@googlemail.com>
* Simplify currying in exports
* Unused import
* Docstrings, whitespace and exceptions
The docstrings were obsolete (not only buttons and hotspots take actions now, and they are now the core of screen language so nobody ignores what they are)
and the information that they can be subclassed is much more important in my view
Also these exceptions are better
* utflf
This is a single function that can fetch data from a web server,
optionally taking binary data or json as input, and returning its
result as bytes, text, or json-decoded data.
* Remove support for Expansion APKs. These have been obsolete for
some time.
* Only use the APK for game files if an alternate base directory is
not in use.
* Fix web icon name
The code looks for "web-icon.png" but the comment and function names
referred to "pwa_icon.png".
* Document the web icon customization
This change replaces the implementation of the data actions with mixins, one for accessing the data and one for changing it. Doing so simplifies and regularizes the implementation, and makes it possible to add new types of data actions, like the Cycle and Increment actions added here.
It's possible (and had been for some time) to rollback into a spot
where checkpointing was suspended - but checkpointing would be re-enabled,
meaning that checkpoint_suspended would be forgotten.
Fixes#5040, which was caused by the interaction of greedy rollbacl
and suspended rollback.
Fixes#5035, which was just never actually looking at the _greedy_rollback
variable.
This is a directory that is checked for update/version.json. If that
file exists and has versions that match the current engine, it is
used as the base directory instead of what the engine provides.
The main reason for this is to support Android games larger than
2GB, by letting those games download content.
This file only exists if the update has finished successfully,
and contains the version information from updates.json.
It's intended to be used ot ensure that an alternate base
directory works with Ren'Py.
Work to support placeholders lead to problems with SVG scaling
when the window scaled. This is resolved by scaling up the
placeholder, if required.
Fixes#5063.
Underlying mouse movement events may be merged or dropped by Ren'Py for
performance reasons. As a result, the relative movement would only be
that of the most recent mouse event, rather than an accurate measure of
movement since the last (published) event.
Instead of dropping mouse motion events outright, this change instead
opts to consume them in a tight loop accumulating their relative values.
Combined with accumulation during merges, this allows published events
to give an accurate picture of the relative movement.
Since iOS 13, Safari uses the desktop mode by default on iPad which removes
the "iPad" string from the User-Agent header. The new detection looks for
an Apple product with touch enabled (there is no MacOS product with touch
screens AFAIK).
This involves copying data from the source files, including block
files that are on disk, into the target files, and then renaming
those files when done.
we can't remove the name assignments because the compat system uses it - I could change that too but let's not touch compat
also remove unused variable
This is an attempt at fixing a stack trace that ended wit:
File "C:\renpy\renpy\ui.py", line 299, in interact
rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
File "C:\renpy\renpy\display\core.py", line 3556, in interact
raise Exception("Cannot start an interaction in the middle of an interaction, without creating a new context.")
Exception: Cannot start an interaction in the middle of an interaction, without creating a new context.
After an autoreload.
This disables:
* Automatic showing the keyboard if the player dismisses it.
* Shifting the screen to where the keyboard is,.
And it changes the keyboard area to the top of the screen.
The goal of this is to work around recently-introduced issues with
Steam Deck keyboard handling.
This disables:
* Automatic showing the keyboard if the player dismisses it.
* Shifting the screen to where the keyboard is,.
And it changes the keyboard area to the top of the screen.
The goal of this is to work around recently-introduced issues with
Steam Deck keyboard handling.
A checkpoint is created when a failed rollback happens, and probably
also when saving. When that statement finishes, we'd want the
checkpoint to become hard.
Fixes#4963.
The previous code could - and would - put the text onto the bottom
half of the screen, which popped the textbox up on the top half,
which looked terrible. By forcing the location, the end result
looks much nicer.
Fixes#4959.
restores the previous behavior to be able to deactivate InputValue objects via "Enter".
for example, the current behavior can be seen in any project using the button that wraps the FilePageNameInputValue object.
restores the previous behavior to be able to deactivate InputValue objects via "Enter".
for example, the current behavior can be seen in any project using the button that wraps the FilePageNameInputValue object.
If we do it in the other order, variables that are wrapped
show up as set, which means they won't be wrapped in an outer
comprehension, causing problems.
Fixes#4943.
... when the viewport is focused or unfocused. The viewport being
focused occurs during drag operations, which should generally
be invisible to the user, so it's not required.
Re-rendering the children of the viewport is also a performance
problem, and so this prevents that from happening.
Fixes#4838.
respect the renpy.store._autosave value when calling renpy.loadsave.force_autosave() directly.
could be annoying if you have a choice menu in a splashscreen for instance.
respect the renpy.store._autosave value when calling renpy.loadsave.force_autosave() directly.
could be annoying if you have a choice menu in a splashscreen for instance.
Fixes#4872 by restoring the `loop_only` parameter of `enqueue()` in audio.py.
After commit `b0b096b`, calling `play` on a music track with the `if_changed` parameter would *always* add it to the queue, even if the same track was already currently playing on loop. This newly queued 'loop' would always begin at the very start of the track, **ignoring any user-defined `loop` point parameters** that were added by the user to allow the track to seamlessly loop. This caused the looping track to abruptly 'restart' the next time it would normally loop whenever a player visited a label that wanted that track to play if it wasn't already looping (for example, the 'market' example in Ren'Py's audio documentation page for `if_changed`).
This change restores the `loop_only` parameter and functionality to `enqueue()` and `play()` to avoid a track from being added to the queue and potentially abruptly restarting the track if it is currently already playing on loop. To attempt to preserve the fix the change `b0b096b` accomplished for #4695, the position/logic of the `c.dequeue()` calls in `music.play()` has not been reverted to it's previous behaviour.
Documentation wise, the Audio documentation page mentions that `if_changed` queues 'an additional loop' of the currently playing track when this situation is reached, which is only an accurate description if the currently looping track does not have a user defined `loop` point (or if the loop point was 0.0). A more accurate description is that the track is queued to play again from the very beginning after the current loop is complete, discarding any user-defined `loop` points. The issue mentioned above is reproduceable using the code present in the `if_changed` section of the audio page, provided the 'market' track has a non-zero `loop` parameter.
While renpy.exe is set up to ignore the variables, renpython isn't.
By filtering them, we can be sure that system python variables
don't break the SDK.
Fixes#4878.
While renpy.exe is set up to ignore the variables, renpython isn't.
By filtering them, we can be sure that system python variables
don't break the SDK.
Fixes#4878.
This prevents a reset from happening in a menu context, and then
causing the reset to not happen in the main context, thus causing
the image to be shown at the wrong times.
Fixes#4828.
This prevents a reset from happening in a menu context, and then
causing the reset to not happen in the main context, thus causing
the image to be shown at the wrong times.
Fixes#4828.
Fixes#4872 by restoring the `loop_only` parameter of `enqueue()` in audio.py.
After commit `b0b096b`, calling `play` on a music track with the `if_changed` parameter would *always* add it to the queue, even if the same track was already currently playing on loop. This newly queued 'loop' would always begin at the very start of the track, **ignoring any user-defined `loop` point parameters** that were added by the user to allow the track to seamlessly loop. This caused the looping track to abruptly 'restart' the next time it would normally loop whenever a player visited a label that wanted that track to play if it wasn't already looping (for example, the 'market' example in Ren'Py's audio documentation page for `if_changed`).
This change restores the `loop_only` parameter and functionality to `enqueue()` and `play()` to avoid a track from being added to the queue and potentially abruptly restarting the track if it is currently already playing on loop. To attempt to preserve the fix the change `b0b096b` accomplished for #4695, the position/logic of the `c.dequeue()` calls in `music.play()` has not been reverted to it's previous behaviour.
Documentation wise, the Audio documentation page mentions that `if_changed` queues 'an additional loop' of the currently playing track when this situation is reached, which is only an accurate description if the currently looping track does not have a user defined `loop` point (or if the loop point was 0.0). A more accurate description is that the track is queued to play again from the very beginning after the current loop is complete, discarding any user-defined `loop` points. The issue mentioned above is reproduceable using the code present in the `if_changed` section of the audio page, provided the 'market' track has a non-zero `loop` parameter.
This allows harfbuzz and non-harfbuzz text to coexist in the same
game, which is useful for testing during development. It will also
provide backwards compatibility when we change the default.
This change ensures that a MusicRoom queues up from the first track if the currently playing track is not part of the playlist. Enables the interjection of the MusicRoom into more complex scenarios (such as hotswapping MusicRooms to effect dynamic playlist changes).
add the two new strings - the confirm_token one is long and should be used for tests by creators - but be careful if others are added in the future
layout of the list has been tested
rename scene to sequence because scene is something else in renpy
don't imply that the game menu or the main menu are the only places from which you can call a replay
fix indenting in the code block, and remove the padding at the start
mistake in a function's documentation
some other stuff
The tutrorial expects to be part of Ren'Py - the example system
may not work if it's being run outside of Ren'Py. This detects
attempts to distribute the tutorial on its own, and aborts the
process.
This is to support the changes to text that produced premultiplied
surfaces, rather than non-premultiplied surfaces. This was necessary
to display emoji properly, and also speeds up the case of normal
text rendering, at least on gl2.
This also removes some old paths that worked with GL_BGRA, which
we aren't using.
Mistake done in 690f249 and not seen by me in #4680.
I tested a save-load cycle on an instance of absolute before and after this very fix, it passed without problem. But if someone added arbitrary attributes on an absolute instance, that will now fail.
These haven't been the default for many years and the players haven't
gottem any attention in that time. Removing them will simplify
the surface that needs to be maintained.
This ensures that the angle computed by Ren'Py from cartesian
coordinates and the angle stored in last_angle are always in
the same range, rather than having potentially odd interactions.
The main use of a polar coordinate outside of the range would be-
to provide a movement through 0 (for example, moving from 350 to 370
degrees), this is now directly supported.
Fixes#4835.
Fixes#4824.
The justification here is that if the creator shows a solid, they
want something, not nothing shown, so we want to show at least 1px
in each direction.
There is no good way to resize the browser window size and
it's not really desirable to resize it anyway. These
changes should partially fix the issues reported in #4760.
Encountered in rare rollback scenarios where self.st would correctly
reflect the drag was complete, but the render st was zero, resulting in
self.st and self.target_st being equal resulting in the divide by zero.
* It's now possible to bind a mousedown event to skip, and other
functions that care about keyup/keydown pairs.
* Mouseup events that are are bound to keyup are ignored.
Fixes#4755.
Documented as ignored and kw-only, might as well not exist at all
The other classes in this file had the same done to them, this one was probably forgotten
This was implemented with a new button in the bubble editor, that
the user can click to clear out all buttons on the screen apart
from the current bubble.
This is intended for used with speech bubbles, but might be useful
in other place. It's a mode where each say statement shows a new
screen, until the screens are cleared by the (to be added)
clear statement.
This tries to fix#4634 without breaking #4167, by recognizing
when a transition has started and propagating the adjusted times
into it, but not the state.
This can probably fail, as events and choices won't be propagated,
but those should be rare in transitions, ideally.
Multiple advantages over the wrapper-class implementation : lighter in memory, don't wrap methods that don't need too, don't spend time converting their parameters, avoid a two-version pickling and unpickling mechanism (with slots), shorter code with less warning silencing.
This replaces absolute with a class that contains a float, and
behaves like a float in most circumstances. However, when an
operation is performed on it that would create a float, an
absolute is returned instead.
This is meant to address #4666 and a class of potential issues
that could be similar to it, where absolutes that are operated
on could become a float, and cause layout issues.
I need to think if this is something that should got into the
fix branch, as it's a major change.
Multiple advantages over the wrapper-class implementation : lighter in memory, don't wrap methods that don't need too, don't spend time converting their parameters, avoid a two-version pickling and unpickling mechanism (with slots), shorter code with less warning silencing.
This replaces absolute with a class that contains a float, and
behaves like a float in most circumstances. However, when an
operation is performed on it that would create a float, an
absolute is returned instead.
This is meant to address #4666 and a class of potential issues
that could be similar to it, where absolutes that are operated
on could become a float, and cause layout issues.
I need to think if this is something that should got into the
fix branch, as it's a major change.
Fixes an issue where fonts located in the fonts/ directory and referenced in .rpy files with just their filename and not the fonts/ prefix would be falsely claimed to be unloadable by the linter despite working just fine in-game. Also fixes the converse issue, where fonts located in images/ directory and referenced without the images/ prefix weren't caught by the linter despite the game crashing when actually attempting to load them.
Fixes an issue where fonts located in the fonts/ directory and referenced in .rpy files with just their filename and not the fonts/ prefix would be falsely claimed to be unloadable by the linter despite working just fine in-game. Also fixes the converse issue, where fonts located in images/ directory and referenced without the images/ prefix weren't caught by the linter despite the game crashing when actually attempting to load them.
The issue was that:
imagemap:
if cond:
idle "idle_true"
hover "hover_true"
else:
idle "idle_false"
hover "hover_false"
hotspot (0, 0, 100, 100) action Jump("test")
Didn't depend on cond, which meant that the hotspot
would not change when the imagemap was updated.
Test: xagrim-imagemap.
This is a bit special, as it define if afm_enable is used or not.
Since this is baked in to older games, restore the previous values,
but let the default statement override them, which was the goal of
the previous commit.
The older config.default_.... variables could force a preference
to take on a value, even if the creator used default to set the
preference.
This changres a few of the defaults in preferences.py, and removes
the need for config.default_... variables.
Fixes#4667.
Apparently, when a window is not resizable on macOS, the MAXIMIZED
flag is always set. Since the window can't actually be maximized,
ignore it.
Fixes#4659.
Previously, the exception would occur with the context stack
already altered. As the exception was handled, contexts could
be removed from the stack, leading to a case where there was
no context - which causes crashes.
This can fix a problem on Python 2, where a .pyo file would be
loaded in preference to an updated .py file, even if the .py file
was created the first time around.
This is likely to only happen if a git checkout exists. In that
case, we determine what branch we're on, and use that to
initialize the version information.
old ["']##[^\n]+?["']\n\s*(?:# Automatic translation\.\n\s*)?new ["'][^#]
(a gift to posterity)
The machine translate script should remove any prepending "## ", translate the rest, and then prepend it again to the result. Otherwise deepl thinks it's a word.
fixes#4633
* The --nightly flag to mark a version as nightly.
* The --print-version flag, to print the computed version.
This will allow distribute to supply version information to the
nightly build process.
* The --nightly flag to mark a version as nightly.
* The --print-version flag, to print the computed version.
This will allow distribute to supply version information to the
nightly build process.
old ["']##[^\n]+?["']\n\s*(?:# Automatic translation\.\n\s*)?new ["'][^#]
(a gift to posterity)
The machine translate script should remove any prepending "## ", translate the rest, and then prepend it again to the result. Otherwise deepl thinks it's a word.
fixes#4633
Looking at some examples in the field, it looks like people are
using radius as a position - so make it work, but improve the
semantics slightly so that the polar coordinates are actually circular.
This removes the ability of radius to be given as a float, which
doesn't make a ton of sense. Is the radius measured compared to
width, height, or something else? Now it's back to being pixels,
which is was in 8.0.
This does make around work better when it is a float, using the
available area.
Polar coordinates now always produce absolutes for xpos and ypos,
allowing radius and around to be in different types.
* Fix alignaround to only take floats, and rotate the floats
properly.
* Make it clear that alignaround really only makes sense with
(0.5, 0.5) as the argument, and that other values don't make
sense.
* Make radius occur after the other linear interpolations in ATL,
to be sure alignaround and around happen before it, which allows
for correctness without a warning.
Fixes#4613.
Exact typechecks are quicker than instance checks.
Since it's direct list methods we're wrapping (and not super calls for example), the return value is either NotImplemented or a list.
No need to complicate things further than that.
Exact typechecks are quicker than instance checks.
If it's a pure list, it needs to be converted.
If somehow it's a RevertableList, no need to trigger a O(n) copy.
If even more weirdly it's another subclass of list, there's magic in place and no need to account for that case (it's the creator's problem).
Finally, if it's NotImplemented, return it as-is.
It's a tradeoff between spending too much time in the low ends of the
range, when all but the loudest sounds will be inaudible, and having
so much sound at the end that there's a pop when the fadeout finishes.
~40dB seems to be a good compromise for all but the loudest headphone
volumes.
Per discussion in #4597.
ios - Fixed a broken string which was in Spanish and changed a duplicate string.
preferences - Fixed a typo which said "Open launcher" instead of "Open launcher project".
This is is a vairable that returns the pre-8.1 fade behavior,
which was linear in amplitude, and so would perceptually barely
fader and then fade out all at once.
Fixes#4580.
This is because the first copy was getting its shaders changed,
which would cause a problem when that copy was being used as a
mask.
This would cause a problem when a live2d layer both used a mask
and was used as a mask.
Per https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=66455
Use elif instead of if
Merge two loops
Make builtin statements use the weakly_reachable set instead of a separate mechanism
Avoid a set update if the original is not read afterwards
These are statements that are not reported as unreachable, but
will only pass reachability to the next statement if the statement
is actually reachable.
Fixes `Exception: config.timer_blocks_pause is not a known configuration variable.`
7d4610d13d introduces `modal_blocks_timer`
which is probably what was meant to be used here.
The new_widget argument will be different each time the
interaction restarts - but it generally represents the same
thing, and so it makes sense to consider it equal for the
purposes of this test.
Fixes#4167.
At least more or less, as it generally doesn't go through Ren'Py.
But on all platforms where voice is supported, the amplitude of
voice is controlled by the voice mixer
This also makes the voice volume mixer available on the
accessiiblity screen, so the volume can be adjusted even
if the game doesn't otherwise use voice.
Fixes#4161.
The maximized flag is persisted, so that if the game is shut down
when maximized, it will start up again maximized.
The size of the game is only stored when non maximized or fullscreen,
so only sensible game sizes are persisten.
Switching from fullscreen to maximized or vice versa goes through
the windowed state.
The first time the window is in the windowed state, it's moved to the
center of the screen - rather than being undefined when the game
starts fullscreen.
Fixes#4155.
In ef6173de4f we added the facility for
alt text to be passed through Transforms to allow its use in SL2. A side
effect of this was to always pass alt text, meaning that the underlying
Displayable's properties could never be empty (they'd contain alt=None).
This has been preventing Transforms benefiting from the optimised code
path in Displayable that avoids creating a new anonymous style.
In order to address this, we now filter out arguments passed to
Transform that ought to be propagated up to the parent class, sending
them only when defined, thus re-enabling the optimisation for the vast
majority of Transform instances.
When a movie in a group is starting, and doesn't have the first
frame, it checks to see if another movie in the group is playing.
If so, it takes the frame from the other movie - preventing flashes
of transparency when switching movies.
Fixes#4475.
This reverts commit d2b5f2fdc9.
This doesn't seem like the right fix, as it has the potential to
cause memory leaks. I'm going to compat the old behavior, and
require it to be explicit.
Break the ridiculously long transform_render function into a
number of smaller methods in a class, and use fields on that
class to store data used by multiple methods.
This is mostly to speed up compilation time by reducing how much
work clang has to do to compile things.
This is a work in progress - it's not well tested, and typing
information is missing or commented out. But it's enough to
render basic displayables.
It does take a fourth parameter, kind, which is private and only used for error messages when the target is not found/writable. It takes a string, so this code doesn't make sense.
My mistake, btw.
This means that all the models that are underneath the render will be
adjusted together, so that relative blits all wind up in the same
place.
This is mostly the case for text, where things like centering, slow
text, and outlines could cause text to appear in different locations, and then be
drawn separately - only to jump into place when slow text finished and
the Text was drawn as a whole.
Fixes#4103.
The latter seems like a more readable syntax to me, as True doesn't
really feel associated with the camera. (And this provides a place
to store the layer.)
This is for two reasons:
* It allows point_to True to work in Transforms, at least if we figure
out a way to refresh Transforms when the camera changes.
* It gets things right if the camera changes position while not
interpolating point_to.
Fixes#4178, more or less. This certainly makes the controller more
responsive, though perhaps not as good as desktop.
This also gains a bit of performance by reducing how far the
controller needs to deflect, and introdces hysteresis to
prevent spurious controller events.
This is useful in screens, where a transform might have a context
contains many variables that are not used by the transform. The
transform shouldn't restart when an irrelevant variable is
changed.
Fixes#4095.
This adds a 1.34x multiplier to textures that have mipmaps associated
with them, and only indicates that a texture is consuming memory when
it's been transferred to the GPU.
Increase the default image cache size to match. This won't actually
increase the amount of memory used by the image cache, just
makes the setting match the memory being used.
Per the documentation, the alpha shouldn't ever have been impacted.
This change instead treats the alpha in the supplied RGBA value as the
tint opacity rather than applying the tint formula to the alpha channel.
The result is the ability to use a colour value of #FF000080 to apply
a 50%-red tint to the target.
Fundamentally, the problem is that ffmpeg's yuv->rgb conversion is
inaccurate, unless it's given flags that cause a ~12x slowdown -
SWS_ACCURATE_RND or SWS_ERROR_DIFFUSION.
That's not tolerable, so we do enable SWS_FULL_CHR_H_INT and
SWS_FULL_CHR_H_INP, which seem to improve things somewhat, without
slowing down conversion by much.
We now also default to the ITU 709 colorspace, which is the default
for HD video.
This works around some issues, reported in #4263, where going
from YUV420 to RGB directly produces artifacts. The two-step
conversion process eliminates these artifacts.
The former allows a game to customize the mapping from page and name
(used by the File actions) to slot (used by the save functions).
The latter lets the names of the autosaves Ren'Py generates be
customized to match.
Fixes#4067.
This is to match the way equality is used in sl2ast to avoid
updating the displayables.
This could be wrong if two displayables use the same (or equal)
InputValues, but that's likely a rare situation.
Fixes#4042.
* Apply displayable before calling per_interact, fixing set_child.
* In the examples, show the use of add rather than child, as the
style property is for specialized use.
Fixes#4432
* doc: tweak and warn about say statement equivalents
* doc: move things around about say statement equivalents
Drain the part about it from the dialogue page
Add a link from there to the statement equivalents page
Add the warning about skipping seen dialogue
Incorporate other explanations, examples and the dialogue window management equivalents
* doc: add more advice about use of the character store
* Remove out-of-place explanation
* Clarify, reorganize, readd interact info with more
* Move the interact override hierarchy around
but leave the interact being passed automatically in the call in the statement equivalents page
* More information about say_arguments_callback
* Add example for say_arguments_callback
fixes#4319
* Add an example of the last advice
* Add an example for auto groups
following feedback
* Integrate info about "poses"
* Fix markup mistake
* Better document Condition and document ConditionGroup
It's a more accurate name, as the variable isn't limited to music,
but works with all audio.
It's set to 0.016, the duration of one frame, which seems about right
and also minimizes popping sounds when an audio file ends.
There were two causes for these. The first was that if a sound
was queued tight, the fadeout would finish, and both playing and
queued sounds would be removed - meaning nothing would play
until the next time periodic ran. Fadeout now dequeues the
queued sound if the fadeout would finish.
The second was a mistake that looked at the wrong portion of the
stream buffer, with the resulting errors often sounding like
clicks.
This implements all four volumes that can be applied to a stream -
mixer, relative_volume, secondary_volume, and fade.
The interpolated volumes (secondary and fade) are now interpolated
using power, rather than magnitude, which leads to perceptually
linear interpolation.
There is a bit of a performance enhancement here - instead of
using decibels as our power units, we use a base-2 power unit
that can be calculated faster.
This is a change to audio mixing that will cause all mixing
calculations to be done on a per-sample basis, rather than
trying to perform mixing on blocks of samples at once.
This will fix issues caused by very short fadeouts, and
enable the move to power-based fading.
These statements used to be recommended, by they're error prone
and now deprecated, and the replacement (say-with-id) has been
available for a long time.
Now, there are deferred warnings for translate None and for
duplicate ids, as well as some infrastructure for enabling
developer mode in python early blocks.
Fixes#4407. Fixes#4406. Relevant to #4243.
* doc: explain the different kinds of variables in screens
* doc: tweaks and better explanations in cds
* doc: Add a warning about overriding the default statement
* Clarify that passing None to Return does not work
"must not" could be understood as "doesn't need to", now hopefully it's more clear.
This scrys for extend text, and appends it to the text being
shown before layout happens. This then lets the text layout
code take that text into account when determining line breaking
and word placement.
Fixes#3963.
Fixes#4392.
This was caused by Text's slow_done callback being triggered when
text was being rendered in the old-side of a transitions. Because
the slow_done callback was running in th new context, the context
was aborting.
This moves running of slow_done into the event handler. Event handling
isn't done on the old-side of transitions, and so the problem does not
trigger.
That prevents it from interfering with other things being named
raw_child, while still not requiring hasattr and getting rid of
type warnings.
Fixes#4391.
The thinking is that renpy.show's with argument should always
be the image that is show - it doesn't make sense for a named
image to override it.
Per #4353.
* Draw video frames on canvas directly for cutscenes
This replaces the features of "00webvideo.rpy" and adds a way to detect
if autoplay is blocked for Movie() as well (with workarounds).
* Let video loop be handled by the browser
* Check for audio or video playback support
A warning message is shown when audio or video playback is not supported.
Video playback requires OpenGL 2 which should be guaranteed by WebGL v1,
but Ren'Py falls back to OpenGL 1 in some exotic configurations (like a
remote X11 server).
* Remove test condition
* Use wasm to decode audio files when needed without disabling video support
Video channels are marked asap in the webaudio module so it is possible to
know which audio function to call for that channel when audio decoding is not
possible by the browser (i.e., for Safari).
* Add details about video support on Web platform
* Remove useless check
* docgen: Modernize signature-reading
Our object's __init__ has a bogus (*args, **kwargs) signature which is actually (), subclasses not overriding it should get a () documented sig
The inspect.getargspec and inspect.formatargspec functions are deprecated in favor of inspect.signature
* Better fix for classes not redefining __init__
Probably faster at execution (although who cares) and does not rely on undocumented identity check
Include an example of a proper usage of time_warp in ImageDissolve
Even though time_warp is mentioned three times in the transition classes document, it's never shown how to actually use it. Since the idea of using the _warper module is not intuitive, and it's mentioned only once at the beginning of the section, I thought it would be best to at least include it in one of the examples.
* document Function's arguments the usual way
* document that Style's fields are write-only
* rephrase beginning of styles
* Warn about not using default
* typo: misdefined var
There are various actions and values that access displayables
in the current screen. Some of these might be run (for example,
BarValue.get_adjustment()) in a hiding or old(-state-of-transition)
screen.
Almost certainly, those values and actions want the displayables
that are present in the original screen, not the copy, and so
the value is redirected.
Fixes#3998.
This mostly affects the case where Ren'Py is skipping, and hence
the images aren't likely to be loaded onto the GPU, and the idle
frame handler is unlikely to be triggered.
When this happens, prediction doesn't - but images will still be
predicted for immediate use. However, the surfaces were not being
loaded onto the GPU until use.
By immediately loading onto the GPU, the surfaces can be immediately
evicted from CPU memory, reducing the maximum amount of CPU memory
in use.
When a for loop has a break or continue in it, it may not
complete all of its executions. The result of that is that
variables that are updated in the loop are no longer constant
in the screen.
This has break and continue mark the loop as non-constant, and
then the loop re-analyzed to mark the variables in it as
non-constant.
text: Allow slow mode use while TTS is active
This relaxes the restriction on using slow text in screens while
self-voicing is enabled. As typical say dialogue is handled by Character
it is unaffected by this change.
The previous approach of predicting all branches was incorrect when
a constant branch was taken, as it could lead a locally const variable
to be given a different value, which prevented further optimizations
from working.
Fixes#4163.
* im.Data, and im.ZipFileImage aren't subject to oversampling, as they aren't "im transforms" - taking an im and returning another
* Composite takes several im parameters, so computing the oversampling of the whole is not trivial. I chose only to support all the images having the same oversampling factor - which is better than nothing, for obsolete functions
* Alphamask already had the constrant of the two images having the same size, they now also must have the same oversampling - seems fair enough to me. If you try it, it will most likely glitch, but that's only if and because Fix subsurface offset when oversampling #4083 is not merged
* All others have been converted.
This is a variable that maps a short font name to a longer font name, allowing font tags (and other places fonts are used) to be shorter when required.
This alters how the Move transition deals with layers that have been
wrapped in a transform by the "show layer" statement.
Previously raw layers were hung on the layers_root widget, so that the
Move transition could unwrap them when needed. Unfortunately this meant
that it was only possible to do this unwrapping if it was the
layers_root widget being transitioned, rather than individual layers.
The change is to instead hang the raw layer on its transformation
directly, allowing it to be accessed both in the case of transitioning
the layers_root widget and also transitioning a layer in isolation. It
also makes the concept of raw_layers on the root widget redundant, and
so they have been cleaned up.
* Patch check_image_attributes
The last change to now-line 147 require `negative` and the elements of `l` to be the same type,
which they are not because the elements of `l` are not of constant type:
when added by line 134 they're lists, but when added by line 139 they're tuples.
This converts them always to lists - the memory-heavier but safer option.
* Convert all to tuples
* Simplify the code
A deferred error is a parse error that might or might not manifest,
based on configuration variables that need to be set early, but can
be in any file.
These errors are stored in .rpyc files, and might become real parse
errors, or might be discarded.
This is intended to address #4284.
It looks like there were two things happening at once. One might have
been caused by aggressive power saving after onPause returns, and
seems to have been fixed by renpy-build@e73258924e907fe613ea6f243ab4a6bcae561632 .
The second was a crash in renpy.audio.audio.pause_all, that is probably
caused by the Audio Focus system on Android 12 starving the audio
thread, leading to things locking up.
This change pauses the audio without acquiring any locks, and was
stable after tens of pause-resume cycles on my Pixel 7.
Addresses #4286.
It's now fine to use the system fribidi, so we use that. This
also upgrades the interface to use Python unicode functions that
are no longer deprecated.
* Use of a zero-length array in the middle of the structure is non-portable,
so replace it with a pointer.
* Apparently, M_PI is non-portable, so replace it with the constant.
* Allow the sync id to be typed in lower-case.
* Set the correct init.
* Do not depend on the system-wide confirm screen.
* Use gui._scale rather than gui.scale.
The new max focus was not stored, causing problems. If maxing a focus
happens when a displayable is grabbed, the grab is broken.
Fixes#4092, resolves#4108.
Having do_done happen before do_display seemed like it could
cause problems, so put the dialogue onto the history_list, pop
it, and put it back on again in do_done.
* It's now possible to specify a list of additional save locations
that files can be saved to.
* A new method that gets a path to a save or persisten file.
Video files are rendered by the browser using a HTML video element. The video
output is drawn to a canvas periodically and the canvas content is copied to
a MEMFS file for Renpy to process it. The file format is TGA to reduce the
CPU load as much as possible (HTML canvas only support exporting data as JPG
or PNG natively).
The Layer displayable has its child injected using visit_all. That makes
the default behaviour of calling the callback on children first
unhelpful, as it descends the tree before the child is replaced. This
change flips that order for the Layer displayable, calling the callback
first on self (allowing the child be updated) before descending into the
new child.
Reuse the tree traversal done to support per_interact to find Layer
displayables in the tree and replace their contents before calling
per_interact as normal.
Uses the clipping keyword argument via properties to avoid making it
usable as a positional argument, and to prevent the creation of a new
style. Additionally the AdjustTimes init is skipped as there's no
benefit to initialising either the times or the child before add is
called by interact_core.
This deals with the case where the the insets caused by the
side displayable might cause the center displayab;e to grow in
one dimension. (For example, Text that has an inset on the right
may be bigger vertically than if there was no inset.)
When this happens, the space allocated to the center displayable
will be allowed to expand until everything fits.
Fixes#4253.
SVGs will be automatically rendered at the drawable resolution,
and then oversampled to reduce them to the appropriate virtual
size. The result is something very similar to the way text is
rendered always sharp.
Fixed#1641.
In py3, an object's method inherits the object's method's docstring.
We don't want that one to pass as one written by us and which should be included in our documentation.
This change ensures that tags are only unstuck when being removed from
the layer to which they were stuck. As they could only have been stuck
to a sticky layer in the first place, there is no need to check if the
layer is sticky.
This change results in much better prediction of the source image,
considerably speeding up prediction and loading while reducing I/O.
Previously it would attempt to load the source image for each frame.
Defaulting to off, because I personally like keeping the game running
when doing something else. (And because this would ruin the usefulness
of music rooms.)
Fixes#3777.
This has been the behavior of Ren'Py, outside of lint, for quite some
time, and the usability improvements likely make up for the chance
that some errors will pass unnoticed.
Fixes#3926.
* doc: typos and references to new clauses
* doc: new parameters to show screen and hide screen
* revert accidental revert
* doc: document new clauses for call screen
and bring nopredict in line with the others
* doc: fix wrong example
Co-authored-by : Booplicate
* Group layer definitions in config.py
* sticky: Initial sticky layer implementation
* sticky: Add sticky argument to renpy.add_layer
* sticky: Compat with older versions without sticky
* sticky: Document config.sticky_layers
* sticky: Use list for config var instead of set
Usability trade off at Tom's request.
* Update persistent.py
Add the __contains__ syntax
Add the _keys method
Include __ keys in _clear's behavior, and use the new _keys method to avoid code duplication
* Document the new behaviors and explain the __ fields
* Add link anchor
* Undo _keys, turn `in` into _hasattr, document this
* better document __-starting fields' limitations
* doc: Move _hasattr and word things better
* typo
This is based on the implementation in iOS, as described at
https://ariya.io/2011/10/flick-list-with-its-momentum-scrolling-and-deceleration .
When the user releases their finger from the viewport while it's moving,
inertia will keep the viewport scrolling until either the user begins to
scroll again, or it comes to a natural stop.
I had some feedback that clicking and then clicking on the text-button
was confusing, and it confused me late last night - so move to a single
click model.
This lets a game developer pre-seed the list of verification keys,
and ship 'blessed' save-games or persistent files that the user's
game will load without asking for verification.
By making the tokens ECDSA keys, it's possible to include a signature
of the log or persistent data in each file. By doing this, it becomes
impossible to simply transfer a token from one save file to another,
allowing it to prove that the data was generated by someone who knew
the public key.
The compromise is that when self-voicing is active, afm will only occur
when the dialogue is focused - it will not occur when another button is
focused.
Two changes in this one. The first is to add a quartet of new
modifiers (caps/nocaps, num/nonum) to reflect if capslock or
numlock are turned on.
The second is to create a new type of keysym, beggining with KP,
that expands out to the key with our without the numlock modifier.
Starts work on #4030.
There are some good reasons for allowing undefull grids (like a
gallery with variable number of images), and not a ton of reasons
not to allow these grids. So this changes the default.
This moves the JS command queue processing into the 20hz periodic
event handler. Moving it out of the idle frame handing makes sure
that the command queue runs even if the the idle frame code is
being starved by frequent events or animations.
The js command overhead was measured, and seems to be less than
the browser's cock precision.
* Generate pwa_catalog.json in a way that matches how renpy-pre.js
uses it.
* Directly update manifest.jso, rather than using search and replace
to do it.
A possibly safer way would be to use os.path.splitext, but it would only change anything if the file has no extension - the current implementation could yield an incorrect result, and splitext would return an empty string.
The block code inside the arg's block was causing an issue in the rendering of the HTML (for some reason).
The `::` was turned into a `.. code-block:: none` because as it's not proper ren'py syntax, it was issuing a warning about it when building - now it knows there's no proper syntax to expect there.
Improve the performance of the loop by avoiding calling for the current time on every step of the iteration. A few milliseconds won't make any difference and could be neglectable.
These were being set, but being set incorrectly, which violates
the invariant (enforced by Python 3.11) that the end location
must be after the starting location.
This enforces that the end of each node is after it's start,
and after the end of each of the node's children.
Unlike web2, where we stubbed out the threading module that wasn't
being compiled, on web3 we use the Python threading module and simply
don't create threads. This is because the locking exists, and so
doesn't need to be stubbed - just the thread starts.
The function is actually called inside renpy.compat, so importing sys after importing renpy.compat is already too late.
It could be considered to use `global sys;import sys` in the function, or to import sys just before or after defining the function, but I'd rather keep things the way they were.
-- review for naming of variables;
-- add field for `MP`: `_name`, `_save_on_quit`;
-- functions:
-- -- `save_MP` as `save_on_quit_MP` with check on `_save_on_quit`
-- -- `save_MP` called for every `MP` instances;
-- -- `get_MP` returns `MP` instance` if has already been created before;
-- add some docs.
This allows an image to be interpreted as a smaller image for the
purpose of layout. For example, a 2048x2048 image with 2x oversampling
will be considered as a 1024x1024 image for layout purposes.
But if the window is scaled up, then the additional detail will be
there.
Previously, properties were configured one at a time. This didn't
allow realistic customizations, which often require groups of properties
to be customized together, so bubble has been rewritten to allow this.
When window auto is true, this will hide the narrator window when
bubbles appear.
This also changes the priority of say-condition-false and say-centered
so the former takes priority, which is more likely correct.
The correct triplets for various arches are:
x86_64-linux-gnu
arm-linux-gnueabihf
powerpc64-linux-gnu
powerpc64le-linux-gnu
The uname-based instructions produced the following:
x86_64-linux-gnu (correct)
armv7l-linux-gnu (wrong)
ppc64-linux-gnu (wrong)
ppc64le-linux-gnu (wrong)
gcc produces the correct results for all four. I suspect this will also
fix non-GNU triplets such as musl, but didn't test those.
* Use the on_show method to set character properties for a speech
bubble.
* Work on the _bubble_editor screen, which allows a property to be
selected for editing.
This is a displayable that allows the user (generally the creator)
to pick a rectangular area on the screen. The intended use of this
is to support placing balloon dialogue onto the screen, though
other uses might be possible.
This adds two new functions, renpy.easy.to_list and renpy.easy.to_tuple, that convert objects to lists or tuples as required.
Co-authored-by: Mal Graty <mal.graty@googlemail.com>
This is the intial creation of a new construct for in-game, non-script
programming. For example, a system for displaying dialogue in popup
bubbles could use a JSONDB with the correct key to choose popup
bubble location.
* Fix sticky draggable viewport
Forget the initial drag position if the visible dragging was not started and the player unpressed LMB.
* Make it possible to use either bool or variant
* Remove the gap
Removes the gap that was noticeable if `config.viewport_drag_radius` was set to a large value.
* Additional zero check
Do not let the image disappear if the final image weight is zero.
* Removed wrong changes
* Fix sticky draggable viewport
Forget the initial drag position if the visible dragging was not started and the player unpressed LMB.
* Make it possible to use either bool or variant
* Remove the gap
Removes the gap that was noticeable if `config.viewport_drag_radius` was set to a large value.
* Additional zero check
Do not let the image disappear if the final image weight is zero.
* Removed wrong changes
This will re-run, and hence re-translate, say statements that have
interact=False, most notably the Say statement that precedes a
menu statement.
This could cause problems if there is a non-idempotent statement
between the say statement and the interaction, like:
e "This will show dialogue when the screen is shown." interact False
$ variable += 1
call screen myscreen
That should be rare enough that a warning will suffice.
By default, timers trigger even if uderneath a modal screen
- a screen timer is intended primarily to display data, and not
by default, as a means of control. (For example, the default
notify screen uses a timer to hide itself without game effect.)
Pauses, by default, respect modal screens, as pause is part of
the main game's control flow.
Both timers and pauses take a modal property, which overrides
if a modal screen is respected or not.
Fixes#3935.
Sometimes, your tag doesn't know what size it will be, but `+`/`-` is not enough. Allowing a multiplier is a two line change.
```
"{size=*2}This is double size{/size} and this is {size=*0.5}half size{/size}"
```
Strip parsed arugment default expression.
So it does not appear with \n when the last argument in the multiline parameters does not have a trailing comma.
The biggest change here is that there is a new _draggable field on
Displayable. If True, the displable itself might be draggable, and
so a Viewport won't steal the focus of it.
There are also several changes that make sure the viewport gets and
releases drags as appropriate.
Finally, draggability only enables when the displayable is actually
scrollable in at least on axis.
Fixes#3910.
Now, when a a touch moves by a certain number of pixels when a
button inside a viewport is focused, focus and grab are shifted
onto the viewport, which then can be scrolled.
This also changes several things about how viewports process
events - now, if an event can be handled by the viewport, the
viewport takes precendence.
This disables the grab, and then changes the focus. This is mainly
intended for used by Viewport and VPGrid to override child focus
when being scrolled.
This allows it to be iterated multiple times, even if the value
is an iterator. This in turn, allows range, enumerate, and zip to
be marked as pure, and hence potentially treated as constant in
a screen.
With this change, foo_ren.py is compiled at the same time foo.rpy
would be, and both files produce foo.rpyc, with foo_ren.py taking
precendece over foo.rpy if both exist.
The purpose of this is to make it possible to replace a .rpy file
that contains an init python block with a _ren.py file, and have
the .rpyc file be replaced with the file fron the new source.
We override :args: not to display `value`, so documenting it looks weird.
We could also choose to let the value argument display in the class signature.
At 3,000+ lines, parser.py was getting a bit unwieldy. This change
breaks off the file processing and lexing portions of the parser
into lexer.py, and leaves parser.py more for the parser trie and
statement definitions.
This will let me add more functionality (the ren.py transfome)
to lexer.py.
The goal of this was to make sure that ffmedia.c compiles without
any warnings under ffmpeg 4.2. This required a series of
related changes.
The first was more changes of how the Packet queue works. The packet
queue is now in charge of allocated and deallocating AVPacket objects
as required, and is the only place where AVPacket objects are created.
This allowed us to get rid of several AVPackets that were allocated
as part of MediaState, and a lot of copying of data to and from these
objects.
This enables and is enabled by a change to fully embrace the new
avcodec_send_packet/avcodec_receive_frame API, and most notably
that avcodec_send_packet is defined to either fully read a packet,
or not read it at all.There was a lot of complexity inherited
from prior APIs that would only partially read packets, which
these changes do away with.
The goal of this is to improve Ren'Py performance by not checking
stores that will not be changed outside of the init phase for
changes before statements.
The icon store is left alone, as it may be going away soon.
If true, this variable declares the namespace constant. Constant
namespaces are not saved or loaded, and do not participate in
rollback.
In exchange for this, the namespace does not need to be scanned
for changed variables, saving a lot of time if the namespace has
no variables that will change after init.
This is a big improvement on Python 3, where store dictionaries can
be created in mostly-sorted order, and hence become the worst-case
for quicksort.
Fixes#3812, which is caused by the store.audio namespace becoming
truly huge, and this bad behavior running Ren'Py out of memory.
This is a big improvement on Python 3, where store dictionaries can
be created in mostly-sorted order, and hence become the worst-case
for quicksort.
Fixes#3812, which is caused by the store.audio namespace becoming
truly huge, and this bad behavior running Ren'Py out of memory.
- Avoid sorting dirs because it's pointless
- strip config.gamedir once instead of many times
- only strip it when safe (this one is a little bonus)
- do not turn into a bytes in py3 (I don't even know why it was the case in py2, but I left it just in case) (and even in that case, now it does it only once)
This simplifies many cases where a page has a ref identifier distinct
from its filename, which makes linking harder to understand when writing
the doc.
Also, it solves a small scrolling problem in such cases.
Some links in changelog and changelog6 were left alone, and some .. _
identifiers too, to ensure compatibility.
Using replace is probably simpler than using split then join.
Also, the markup using a leading whitespace is the quote markup in sphinx, which is a bit ugly. A bullet list renders better, I think.
Using replace is probably simpler than using split then join.
Also, the markup using a leading whitespace is the quote markup in sphinx, which is a bit ugly. A bullet list renders better, I think.
- Avoid sorting dirs because it's pointless
- strip config.gamedir once instead of many times
- only strip it when safe (this one is a little bonus)
- do not turn into a bytes in py3 (I don't even know why it was the case in py2, but I left it just in case) (and even in that case, now it does it only once)
This simplifies many cases where a page has a ref identifier distinct
from its filename, which makes linking harder to understand when writing
the doc.
Also, it solves a small scrolling problem in such cases.
Some links in changelog and changelog6 were left alone, and some .. _
identifiers too, to ensure compatibility.
When called, this causes audio to be processed, as it is at the
start of an interaction. This is intended for cases where audio
is played and then stopped with a fadeout, which default to not
playing anything.
Fixes#3805.
Mouseareas are supposed to not hover if the keyboard is being used for focusing, but this was broken by an if/else statement that changed the is_hovered value again without regard to if it had already been set to false because of keyboard focusing. Changing it to elif/else ensures the value of is_hovered is only changed if it hasn't already been set to false because of keyboard focusing.
* Only use default_focus when the last interaction was not a mouse
click, mouse movement, or touch. This prevents focus flickering when
where default_focus occured, the mouse event was immediately processed,
and the focus changed.
* When a displayable with a greater default_focus appears, switch to
it.
* When the displayable with the greatest default_focus disappears,
switch to the new greatest default_focus when nothing else is
focused. This allows going to the default item in a lower priority
menu if a higher priority item disappears.
Fixes#3761.
Mouseareas are supposed to not hover if the keyboard is being used for focusing, but this was broken by an if/else statement that changed the is_hovered value again without regard to if it had already been set to false because of keyboard focusing. Changing it to elif/else ensures the value of is_hovered is only changed if it hasn't already been set to false because of keyboard focusing.
Events (other than modal TIMEEVENTS) should not be delivered to
the pausebehavior when it's behind a screen, and since TIMEEVENTS
can be combined with other events, it needs to be possible to
end the pause on any event.
Events (other than modal TIMEEVENTS) should not be delivered to
the pausebehavior when it's behind a screen, and since TIMEEVENTS
can be combined with other events, it needs to be possible to
end the pause on any event.
This attempts to address #3799, which I'm guessing is caused by
the game being saved when in an error handling context that's
handling a parse error.
What this does is to try to retain the initial save that is created
until the save is loaded successfuly, or alternatively until the
game quits.
By not creating a new save slot for each reload attempt, this
tries to avoid creating a save when Ren'Py is in an unstable
state.
This fixes a problem where using renpy.file would open script.rpy
when no translation was in effect, but tl/language/script.rpy would
take priority when a translation was in use.
Fixes#3780.
These functions had gotten out of sync, with __eq__ being defined
and __hash__ being ignored. On Python 2, that mean objects that
would compare equal but have a different hash, while on Python 3,
an error would be raised indicating that the object was unhashable.
This resolves this ambiguity by adding __hash__ to classes that
are non-subclassables and have __eq__ defined, and then by removing
__eq__ from the base subclasses, leaving the default equality,
with is object identity.
This allows files ending with _ren.py to contain Ren'Py script,
be loaded, and operate as part of a normal game. The transformation
from Python to Ren'Py script has yet to be implemented.
When followed by as :, pass takes an optional block that it
then ignores.
This is mostly intended for _ren.py files, where it will be used
as a way of ignoring lines of Python that only exist to make
Python type-checkers happy.
The buried lede - a _ren.py file will be a Python file (that can be
analyzed with Python tooling) that is convered internally to a
.rpy file, and then compiled as Ren'Py. At least, that's the plan.
This probably doesn't matter as much in practice, but it's the right
calculation for audio.
A more important change is that the default values for mixers are
now specified as a percentage of a mixer bar.
Internally, the volumes are stored as linear volumes, being upgraded
the first time a version of Ren'Py that supports linear volumes is
run.
All other places a volume can come into Ren'Py are updated to consider
the new config.quadratic_volume variable, which will square the volume
to get linear volume.
This had been left in to support potential issues in the change
from SL1 to SL2. That wasn't used, and almost certainly isn't
being used anymore, so the parser can be removed.
SL1 screens can still be loaded if they exist in SL1 files,
as this only affects the parser, not the runtime.
Fixes#3430.
The changes here store the text objects that are created as part
of a multiple say statement, then pass those into SayBehavior,
which will use them to determine how long the autoforward will
pause for.
Fixes#3744.
This fixes a problem where a Function with equal mutable arguments
would compare equal to another similar function, while not
actually performing the same action.
In py3 the print_exc function prints a str, which files opened in binary
mode do not like. Conversely py2 doesn't seem to mind whether the file
is in binary mode or not.
This matches the approach taken in the rest of the file, where various
logs and outputs are also not opened in binary mode any longer.
Instead of creating a .old file that can't be deleted, the files
are moved into updater/deleted. That directory can then have a
delete attempted each time Ren'Py starts, and the files are out
of the way.
Especially the update packages. Fixes a problem where 8.0.0
couldn't be unpacked because the steam dlc didn't include the
package file the steam dlc existed in.
This allows a default focus to be modal, which means it will be modal
for the entire screen without the dismiss itself having to take up
any size.
Fixes an issue where displayables behind the dismiss could still get
mouse focus incorrectly, but weren't clickable.
Doing so causes it to be in the stores that are creates, which
prevents those stores from exporting all their names to
from store.whatever import *
Fixes#3693.
Before this change, it was possible for an entire file to be uniformly
indented and still accepted. That's not something that was intended.
This won't lose any games, as the check is only performed at parse
time, and so the source code exists (and can be dedented easily).
Fixes#3691.
The code being removed was unreachable prior to 7.5/8.0 due to a bug
meaning that the paired parameter was never passed. This meant it could
never be a dict, and that this code was unreachable.
Specifically,
screen test(param):
add Movie(play=param + ".webm")
label start:
call screen test("a b c d")
return
would crash, as the channel used is based on the movie file name,
which wouldn't be registered in the init phase.
* doc: Add a dedicated lint section
* add link anchor
* doc: add Lint advantage for define and default
* doc: add lint reference in displaying-images
* add a reference to the main lint section
* doc: reference to Lint in statement equivalents
* fix phrasing
* fix wording
* Add links in quickstart to other parts of the doc
not too sure about the word "article" though
* linkify Statement Equivalents, and move renpy.pause inside it
* doc: add see-also section to displaying-images
* fix typo
* doc: Add anchors and fix refs
* doc: Add anchors and fix refs
* doc: Add anchors and fix refs
* doc: Add anchors and fix refs
* doc: Add anchors and fix refs
* doc: Add anchors and fix refs
Before the logdir is set, the logfile might be created in the
wrong place. Logging lines before then can be ignored, as they're
likely redirected prints, and once the log is ready logging
begins.
On the new Galaxy Tab A7 Lite, I noticed that if a game didn't respond
to the DIDENTERBACKGROUND event fast enough, it would be unable to
execute anything, and stop responding. This responds immediately,
which then allows the game to save before the TERMINATE request
happens.
This fixes a problem that was showing up on some samsung devices, like
my Galaxy Tab A7 Lite, where for some reason (potentially due to
alignment restrictions gl doesn't specify) uploading a texture
directly causes a crash.
Per #3643.
Parameter order of renpy.with_statement changed 11 years ago which
resulted in the value intended for the "paired" parameter being passed
to "always" instead.
Specifically, an ATL function statement is considered to be blocking when running it with st=0 returns non-None, and non-blocking when running it with st=0 returns None.
Fixes#3636
This restores the behavior of 7.4.10 and earlier, and it makes
sense - a modal screen blocks the saybehavior's functionality in
its entirety.
Fixes#3624.
The find_focus method iterates from back to front, and so when
mark modal is called, the focuses behind it (that have already
been given to the callback) are the ones that can't be given focus.
The previous implementation got that wrong - the displayables in
front were the ones that couldn't be given focus, which lead to
random problems.
Fixes#3617.
This is something of a compromise, to prevent games that cause
interaction restarts in their unfocus handlers from preventing
the game from interacting at all.
Fixes#3617.
This adds a new download, sdkarm, that's meant for running on
the Raspberry Pi and ARM Linux.
It also modifies the linux build to include ARM versions if the
ARM directories are present in lib.
* Look for editors in renpy_base rather than basedir, allowing
the editor system to be used even if the launcher is launched
directly.
* For VSCode-Linux, use renpy.arch to locate a platform-specific
version of the editor.
* Do not present Atom as a valid choice when running on a platform
where we don't support Atom.
* Only offer jEdit to users that have it already installed - it's so
obsolete at this point, that it's only a confusing extra option.
* Remove python creation of screens from the doc
* doc: Undocument various ui functions and renpy.define_screen
* doc: Move and rephrase renpy.predicting's documentation
* Clarify renpy.variant
and remove reference to screen creation and style setup
* doc: Remove unnecessary interstitial addition
* Changelog the removal of python screen creation
* Linkify config.show and config.scene
* Deindent stuff
* Specify that label is a string (and deindent)
* Add explanation for the channels
It was asked for...
* better
* Add a link to the audio actions section
* Change args of Rollback and tweak HideInterface
...and deindent
* Document setdict with lists, and clarify names
...and deindent
* Update displayables.rst
* Replace the part removed from displayables.rst
fixes part 2 of #3500
* Document Text's slow_done arg
per #3500
* Document Texts **properties and clarify its mipmap
finalize #3500
* remove unnecessary backslash
* Add the volume section to the Audio page
* Document the mixer parameter as required
and add explanations
* Mark "all mute" as deprecated
* Remove "main mute"
* Add and edit content in the volume section
* Update preferences audio functions
* Add set_mute
* Update list of mixers
* Update list of mixers
* Fix rst
* doc: Expand build.archive's documentation
* doc: Document build.classify's second argument
how it creates new valid file_lists
* doc: Separate the archive names from the file_list
* doc: Finish separating archive and file_list names
* doc: clarify build.classify
* doc: Document build.archive's second argument
how it creates new valid file_lists too
* doc: expand build.package's example
Co-authored-by: raspberry-soft <87047775+raspberry-soft@users.noreply.github.com>
Co-authored-by: raspberry-soft <87047775+raspberry-soft@users.noreply.github.com>
The name brings it inline with the Ren'Py verb_noun naming style,
and is useful now that file() isn't part of Python 3. The encoding
is useful in Python 3, and by allowing a default encoding to be
set, help port Python 2 games to Python 3.
Newer versions of Python 3 enforce the condition that a global
statement has to come before variables are assigned, while older
Python versions didn't enforce this.
Since games rely on this to work, this pass finds all the global
statements inside the function, replaces them with pass statements,
and then creates a new global statement at the start of the function.
This isn't needed for nonlocal, as no games currently use that
statement.
It seems a decent number of Ren'Py 7 games have print statements,
and so removing those statements makes it possible to run those
under Ren'Py 8, at least if no other problems show up.
Based on Tom's work in a851baff1b.
- Checks for membership in reachable which is a cheaper option than
checking for a not None lookup, at the cost potentially permitting the
o_id of None itself.
- Adds o_id to seen before type checking, so that if we see them again
we can short-circuit the type check.
- Type checks o, rather than reachable[o_id], saving a lookup.
Due to a bad test, objects of revertable types that were not
reachable could be marked as such. This lead to multiple problems,
like unsaveable types being saved, and objects that weren't
supposed to be rolled back (like the console) being rolled
back.
Py3 doesn't let the thread that owns the GIL get it again, and
so it needs to be released before an operation that can read
from a file, which this one seems to be able to.
* Wording changes.
* Use zero-height fixeds to position text above and below the language lists.
This means that the language buttons will not move if a translation changes
from one to two lines (or vice versa).
* Allow the language selection to be repeated with an environment variable.
* Add some hidden comments to help people translate.
This moves the preferences screen to a multi-tab design, with
the left 1/3 being a list of tabs and the right 2/3 being the
tab content.
The motivation for this was that the preferences were getting
overfull, and some translations were breaking the layout. By
dividing the screen up, we get a lot more space to play
with.
This controls the resolution textures are rendered at, drawable
(if true, the default) or virtual (if false). This mostly exists
to control the artifacts that occur when upscaling a flattend image.
Fixes#3409.
Fixes#3349.
The _unique method should only be called if a displayable will only be
entering the tree of displayables to be rendered once. That
wasn't the case in certain circumstances, when _unique was
being called from _duplicate, which is usually called when a
displayable is added.
This might trade performance (additional duplications) for
correctness. That's something we can accept for now, and
eventually deal with in the future by optimizing when
displayables are duplicated.
The reason for this is that the windows zsync can only handle
2GB-1 files, probably due to a signed int issue. Breaking the
input files up avoids this problem.
Fixes#3496.
Previously nested interpolations would lose scope due to it not being
pushed down into the recursive call. Unfortunately the fix is slightly
non-trivial.
The string.Formatter class does not naturally expose the provided scope
to the convert_field method which is where we need it for nested
interpolations. In order to get it there we use the expectation
(documented, see ref) that the value provided to convert_field is the
obj returned by get_field which is supplied with the scope.
Additionally we handle nested interpolation via a call to self.vformat,
rather than round tripping through renpy.substitute since we're actively
not translating or changing the scope.
These displayables qualify, as (with the exception of add and image,
which are handled separately) the displayables aren't going to
have additional references.
By marking the displayables as unique, excess duplication can be
prevented.
Fixes#3256, probably, hopefully for good this time.
It looks like the cause of the problem might have been the timeout
being cancelled between the end of the slow text and the event
being delivered. By calling slow_text from render, there's no
chance of this happening.
The problem was that when rolling forward, Ren'Py would stay in
rollback for the entire new page.
This fixes the problem by creating a checkpoint after each line
of dialogue, and conditioning roll-forward on having the
checkpoint existing.
Fixes#3249.
This ensures that a rollback point will be created at the next
statement, preventing random number generaton from being
reverted when a save is loaded.
Fixes#3479.
The new behavior of a modal window is to block mouse events that
happen within the window, and prevent focus from being given
to displayables behind the modal window.
This runs an action when the player clicks, hits space, or hits
enter when nothing else is focused. It's similar to the say behavior,
but meant to be put in the background of popup windows and menus.
Fixes#3472.
Render.modal is meant to optimize the case where things are globally
modal - nothing below the displayable is considered by the focus
system.
Window's modal property is meant to prevent displayables behind the
window from getting focus, while still allowing things behind the
window to get focus.
* renpy.current_screen() is now documented.
* Some fields returned by renpy.current_screen() or renpy.get_screen()
are now documented.
This is designed to make an implementation of #3235 in an action
possible.
The underlying functools.partial doesn't have an __init__ method, so the
super call bounces up to object which doesn't take arguments. This is
fine in normal use but presented issues in some pickling scenarios.
Since we can be slightly more efficient without it, and it avoids the
edge cases with pickle, nuke it.
* If local.properties or bundle.properties exist, preserve those.
This means that it's no longer required to run Install SDK
after a clean.
* Allow android clean to run if .android.json doesn't exist.
Per #3019.
It's been set this way in screens.rpy since the new gui came out,
meaning very few games in development should use the old value.
It makes sense to change the default and remove some boilerplate
from games.
Fixes#3461.
When reading default a.b.c = value, renpy will check for :
* a.b.c being a store
* a.b.c being already defaulted (case already covered)
Co-authored-by: Mal Graty <mal.graty@googlemail.com>
This lets the empty window shown as part of a choice be
customized. The main use would be to set this to extend to
repeat the last line of dialogue.
Fixes#2606.
This goes back to the original idea of it, which was to provide a
way of normalizing track volumes. This change makes it so that the
relative volume selected sticks with the track.
This means that, now, if you queue a track with a given relative
volume, that only takes effect when the track is played. Other
changes make relative volume work better with rollback, and
loads.
Fixes#2654.
This is similar to the cycle removal that's taking place elsewhere
in Ren'Py, and prevents the state passing that happens in a button
from updating the child when the state changes.
Fixes#3181.
This deals with the case where the timer's events are blocked -
the timer should still be running in that case, and then trigger
once the events are unblocked.
Fixes#3446.
This is designed to handle the case where a transform is blocking
events and then stops. There many have been timeout events ignored
by this, and so this will redeliver them.
Fixes#3161, by not bothering to walk through the screen and
all its details before saving. This should also work for rollback,
as nosave is for internals, that fundamentally should not pass
reachability.
Previously, modal would remove displayables from the focus
list entirely, which prevented unfocus from being called. Now,
it sets a flag that only considers the displayables for unfocus.
Fixes#2743.
In a roundabout way, by allowing the callable to return itself
(or another callable), and then be called again with (x, y, w, h)
as the arguments.
Fixes#3343.
Objects with infinite length that are still iterable have to store their
real data somewhere else, so there is no need to iterate them to
find it.
Per #3436.
Most of these were the now-obsolete practice of using an expression
to prevent unused import warnings. Since unused imports are a lot
more subtle in vs code, there's no need to have an expression
prevent them - especially if the expression causes problems.
The main justification for this is that roll forward only preserves
the return value of the screen, or a jump out of it, and doesn't
preserve any other side effects in the screen. This can lead to the
game being in a different state between playthoughs.
A new roll_forward property allows it to be re-enabled for particular
screens.
Alternatives considered were:
* Trying to determine which actions should allow a screen to
roll forward. This was implemented, but was rejected as a maintenance
problem, and hard to make understandable in the documentation.
* The reverse of rollback was considered, but it seems hard to make
work. What should be done if the player changes sone data inside
the call screen, then rolls forward, causing a different set of
data to be updated?
Fixes#2563.
If the browser supports all types, play back audio through webaudio.
If not, play audio back through wasm/ffmpeg/ffmedia. This is intended
to allow games that use ogg or opus to work on Safari by default, while
games that only use mp3 audio can change config.webaudio_required_types
to gain the benefits of webaudio.
This is base on neobendict's solution in #3334, just encapsulated
into function. The problem is that setValueAtTime is the only way
to reliably set AudioParams in firefox, so all setting was moved
to run through that method.
Fixes#3334.
This fixes#3165, which was caused by the Fixed containing a layer
adjusting the times given to everything in that layer. When what
was in the layer was a MoveInterpolate, this led to the movement
restarting each time a new transition was created when an
interaction restarts.
The presence or abscence of a child seems like it's the right way to distinguish
ATL uses as a displayable from ATL that's being included.
Fixes#1956, per #3350.
Change the crop_relative transform property to take a third value, "area", representing the area supplied to the displayable. This is in addition to the current behavior when true, which has been changed to "child".
For now this isn't possible or supported, so there's no need for the
machinery to support it. At such time we have a clean way to implement
it this method can be updated to support it.
Based on #3160, with some changes to how the overriding works. See
the discussion there.
Closes#3160.
Co-Authored-By: Gouvernathor <aanonyme.personne@hotmail.fr>
This is a library that's intended to be used to provide os-native
file picking services to the launcher, to replace the various
libraries that are used now.
This is included with Ren'Py because it's not in pypi or in
operating systems, and it's needed for an os-linked build of
Ren'Py to work.
This makes RENPY_ATOM work without needing to download any part
of atom, and without needing to include the atom/ directory when
atom is not installed.
A list of screens that are always shown, even in the game menu
screens and other contexts where the overlays are not.
This is intended to make the trace screen always shown, see next
commit.
It's now possible to customize the screen that's used to show
individual images on per-gallery basis.
The Gallery.image and Gallery.unlock_image methods now take
arguments beginning with show_. These can be used by the image_screen
to display image metadata.
Fixes#22.
Fixes#2519.
This is done in the error handling routine, rather than __init__,
so that failing to advance the lexer before the first line remains
an error.
This keeps the keyboard from hiding the text that is being input,
which would keep thngs from working.
This is written so that it can be dropped into Ren'Py 7.3.5 and
7.4.11 without change - that's why transitions were leveraged,
rather than making changes to the Ren'Py core.
Currently keys for every store are added to a Rollback object's stores
and delta_ebc dicts, even if they contain no data. When rolling back
these dicts are iterated over, and the empty stores amount to no-ops.
These empty data structures are also serialised/de-serialised by the
save system (albeit efficiently) but yield no benefit.
This change is to skip recording entries for stores that haven't
changed, the resulting log should be functionally equivalent to existing
behaviour, but cut down on the amount of extraneous work to handle them.
As the code processing the log doesn't change or mind stores being
omitted, this change should be completely transparent and both forward
and backward compatible.
* Characters with the same count are grouped together on the same
line, and ordered by name.
* The statistics are only displayed when config.developer is true,
to prevent spoilers.
When fast-forwarding through ATL, one frame from every interpolation is
shown due to the first_frame flag. To avoid this, only set the flag if
the st rests within the duration of the interpolation. This ensures that
the flag is correctly set, but only for the interpolation that will be
active at the st.
Having `matrix[k] != matrix.m[k]` is weird. But changing the really faulty thing here, the `fields` list, would break compatibility with the existing matrices having been constructed and accessed via the .?d? accessors.
A quick look in the current code shows no use of the [] operator on Matrix instances, so this one should be broken rather than the three-letter accessors.
This fixes#3274, which is a subtle bug that was actually there in
Python 3, if rarely encountered. The problem is fundamentally
that:
eval("{ i for i in l if i == b }", globals={ "l" : [1, 2, 3]}, locals={ "b" : 2 })
Doesn't work, since the comprehension (non-list comprehensions in
py2, list comprehensions also in py3, generator expressions in
all versions) creates its own scope, and since b isn't defined in
an exterior scope, b is loaded with the LOAD_GLOBAL opcode, which
doesn't check locals.
To fix this, the statement is wrapped in a lambda that is immediately
called with the variables it loads - so the expression above is
turned into:
(lambda l, b : { i for i in l if i == b })(l, b)
This creates a new scope, which the python compile can find,
and compile the generator expression or comprehension to
pull from.
To make it easier to navigate all three.
renpy.revertable
Contains all of the RevertableX classes, as well as some
with different names that function similarly.
renpy.rollback
Contains the rollback infrastructure, except for the Revertable
classes.
renpy.python
Contains the stores and Python transformation, compilation,
and evaluation/execution.
This prevents a race condition caused by something being enqueued
but not played before renpy.get_playing() is called, the first
time the channel was used in a session.
This mostly manifested in in renpy.movie_cutscene(), which could
skip the movie if the outcome of the race was wrong.
We now use prefixes for the different paths, with temp: being
in the temp directory, backup: being a backup file, and no
prefix meaning the target directory.
This also adds the move command.
I have added a "{" at the beginning of the line 1881 to solve an uncaught exception:
# game/gui7.rpy:311
old "{size=-4}\n\nThis will not overwrite gui/main_menu.png, gui/game_menu.png, and gui/window_icon.png, but will create files that do not exist.{/size}"
new "size=-4}\n\nEsto no sobrescribirá gui/main_menu.png, gui/game_menu.png y gui/window_icon.png, pero creará archivos que no existen.{/size}"
Traceback generated by Ren'py prior to this change:
While processing text tag {/size} in u'{b}Aviso{/b}\nSi contin\xfaas se sobreescribir\xe1n las barras, botones, huecos de partida grabada, barras de desplazamiento y controles deslizantes personalizados.\n\n\xbfQu\xe9 deseas hacer?{size=-4}\n\nEsto no sobrescribir\xe1 gui/main_menu.png, gui/game_menu.png y gui/window_icon.png, pero crear\xe1 archivos que no existen.{/size}'.:
File "game/gui7.rpy", line 319, in <module>
File "game/interface.rpy", line 539, in choice
File "game/interface.rpy", line 329, in common
Exception: u'/size' closes a text tag that isn't open.
Regards.
Trying to coerce the child arg to Transform.__call__ into a displayable
adds an avoidable call and could lead to redundant duplication (in the
case where the coercion yields a duplicatable displayable).
Instead, use getattr in the duplicatable check to prevent raising and
allow __init__ (which already does arg coercion) to handle it as normal.
Refreshing a Text displayable whenever self.slow is True and
the slow text has not timed out should mean that regardless
of whatever is going wrong, slow_done should be called.
Per #3256.
The installer is a tool that will provided primitives for
installing loosely-coupled components (like editors) into
Ren'Py, and eventually, into games.
For now, this implements a download primitive.
The wanted and remove kwargs on Character.resolve_say_attributes and
images.apply_attributes were previously used to support the speaking
attribute feature, however that has since moved over to using the
temporary attribute functionality and these parameters are never passed
as anything beside empty lists, so we can clean them up.
This only happens when config.developer is not true. It's meant
to fix an issue introduced in 7.4, where a displayables
visit_all method can be called before an interaction begins.
That's a problem with ATL that depends on a variable that's defined
between the show and interaction - something like:
show atl_that_uses_foo
$ foo = True
"This."
The reasoning for visit_all was to allow the state of the ATL to
be taken (say, by having multiple shows in a row) without an
interaction to take place. Since the older games with this
problem can't successfully do this, it's okay to ignore this
error.
Fixes#3229.
This includes undocumenting some config variables that are not
relevant to modern Ren'Py. These variables will still work and
remain supported, but probably shouldn't be used in newer
games.
I have mainly tried to give consistency to the translation and corrected an abusive use of capital letters. In Spanish, it's not correct to capitalize the first letter of each word in a menu.
Regards.
This is intended as infrastructure that's meant to detect Python 2
code being loaded out of .rpyc files, that can't be easily changed
for Python 3, so fixes can be applied.
This includes a Python3-specific unpickler that loads as utf-8
with surrogateescape, and then converts it back to latin-1
for the purposes of unpickling datetime.time, datetime.date,
and datetime.datetime objects.
It also isolates pickle versioning into the one module.
It's now YYMMDDCC, where CC is the commit of the day starting with 1.
The goal is to make it easy to see how old a given nightly or release
is just by looking at the full version, and it also means it's
not necessary to tag that start of each release.
Make clear you must register the achievement with a stat_max in order to report progress. As the doc suggests registering achievements is only needed for Steam, thus crashing if `achievement.progress(name, complete)` is called.
Fix 1 : all four dump methods should use the same protocol, so all should use renpy.compat.pickle in any case.
Fix 2 : use the preferred protocol instead of the local highest
Fix 3 : partially fix the py2-py3 compatibility error
- Rename config var to make clear it contains callbacks.
- Add support for a generic fallback callback.
- Emphasise that attribute callbacks must not be influenced by state.
This is to support images having a "weak" set of default attributes
applied to them when they are first shown, allowing for more complex use
cases with a minimum of boilerplate in scripts.
While similar in nature to the existing config.adjust_attributes, this
feature only applies to images when they are first shown, and is "weak"
in the sense that it may not countermand attributes from the script.
That is, so that py2-windows-x86_64 and py3-windows-x86_64 can be
build alongside each other. This is a step in building Ren'Py 8,
and enables Ren'Py 7 to be distributed while Ren'Py 8 is worked on.
It's cleaned up in RevertableSet but not in RevertableList.
Making a cleaner code by getting the "wrapper" function out of the class definitions could be done, but pain to test/check, and this works.
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.)
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.
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.)
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.
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.
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.
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.
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.
This fixes p547534, which has a Text that uses the scope not being
updated when it's inside a constant transclude. This makes the
uses_scope lists created by displayables, only, and stores the
scope in the uses_scope list to make sure the correct scope
is used.
It now only does it through a reference when it is a reference
with the same name.
This is a compromise behavior, at best - at some point, we need
to switch to a persistent dag rather than what we have now.
Per p547535 on LSF, and also takes into account #2864.
Per #3097.
Since the first thing change_focus does is to ignore changes
when grabbedm there's no reason to perform an expensive
focus_at_point search that will just be ignored.
This should improve performance, as usually the topmost
displayable is the one that should be given focus, and
so there's no need to consider others.
Per #3097.
A line of dialogue ending in {nw} will no longer wait for the
voice to end before terminating.
A line of dialogue containing {fast} will sustain the last
voice statement.
This fixes#3086 and fixes#3082, which were both caused by
large images being rendered; and 372d6d026e .
This would cause Renders to show up in the cache, be killed, and
lose the child textures.
What this does is to detect such renders, and avoids removing their
children.
Clicking on the button to view the list of changes will open the browser and load the Ren'Py page.
The button will only be displayed in the pre-release and release channels.
There wasn't much of a point in making it a RevertableDict, as
far as I can tell - since it's not reachable from a root, it should
never actually participate in rollback.
Fixes#3064.
This reverts commit 68cbf3d87d.
I don't believe this is right - when rollback happens, the context
will be replaced by an older copy of the context. So there's no
reason to rollback this dict.
This allows pre-compiling all constants ATLs that don't have parameters (or have empty), including ATLs defined for show, scene and show layer statements
This change adds parameter passing during ATL analysis, so it includes processing of constant variables and pure functions.
This allows more ATL based images and ATL transforms to compile themselves in the init phase.
Anonymous transforms also take them into account based on screen analysis.
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
# 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
@@ -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 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_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_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, 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.")
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.")
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package.")
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages.")
GENERATE_KEYS_TEXT = _("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,10 +57,11 @@ init python:
CONNECT_TEXT = _("Connects to a device over Wi-Fi, on Android 11+.")
DISCONNECT_TEXT = _("Disconnects a device connected over Wi-Fi.")
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
@@ -92,13 +93,17 @@ 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.
@@ -106,15 +111,14 @@ 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 os.path.exists(rapt.plat.path("project/local.properties")):
if not rapt.keys.keys_exist(project.current.path):
return ANDROID_NO_KEY
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")):
# 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,21 +27,24 @@ 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.")
__("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 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.")
__("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\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.")
__("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.")
__("The JDK is present and working. Good!")
__("The Android SDK has already been unpacked.")
__("Do you accept the Android SDK Terms and Conditions?")
@@ -53,12 +56,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 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 found an android.keystore file in the rapt directory. Do you want to use this file?")
__("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 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.")
__("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.")
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)
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
@@ -471,7 +583,10 @@ init python in distribute:
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."), pause=True)
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)
self.log.close()
return
@@ -486,16 +601,17 @@ init python in distribute:
if not packagedest:
try:
os.makedirs(self.destination)
except:
except Exception:
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.
# Add Python (with the same name as our executables)
self.add_python()
# Build the mac app and windows exes.
self.add_mac_files()
self.add_windows_files()
self.add_main_py()
# Add the main.py.
self.add_main_py()
@@ -556,15 +675,31 @@ init python in distribute:
self.merge_file_lists()
# Rename the executable-like files.
if not build['renpy']:
self.rename()
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.")
# The time of the update version.
self.update_version = int(time.time())
self.files_filter = files_filter
for p in build_packages:
for f in p["formats"]:
formats = p["formats"]
if force_format is not None:
formats = [ force_format ]
for f in formats:
self.make_package(
p["name"],
@@ -573,20 +708,18 @@ init python in distribute:
dlc=p["dlc"])
if self.build_update and p["update"]:
self.make_package(
p["name"],
"update",
p["file_lists"],
dlc=p["dlc"])
for update_format in self.list_update_formats():
self.make_package(
p["name"],
update_format,
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()
@@ -594,7 +727,24 @@ init python in distribute:
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."))
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"))
AD = _("(Recommended) A modern and approachable text editor.")
# 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}")
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(
2,
"jEdit",
_("A mature editor that requires Java."),
_("jEdit"),
_("JEdit is deprecated, using another editor is recommended."),
"jedit",
_("1.8 MB download required."),
_("This may have occured because Java is not installed on this system."),
_("This may have occurred 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(
@@ -190,7 +246,7 @@ init 1 python in editor:
None))
for k in editors:
if k in [ "Atom", "jEdit", "System Editor", "None" ]:
if k in [ "Visual Studio Code", "Visual Studio Code (System)", "Atom", "jEdit", "System Editor", "None" ]:
continue
fei.append(FancyEditorInfo(
@@ -210,7 +266,8 @@ 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:
i.installed = True
if i.dlc and not i.dlc.startswith("extension:") and not i.deprecated:
i.installed = True
def fancy_activate_editor(default=False):
"""
@@ -257,9 +314,12 @@ init 1 python in editor:
if not fe.installed:
# We don't check the status of this because fancy_activate_editor
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
renpy.invoke_in_new_context(interface.error, _("An exception occurred while launching the text editor:\n[exception!q]"), error_message, exception=exception)
def CanEditProject():
@@ -469,10 +529,31 @@ init 1 python in editor:
try:
e = renpy.editor.editor
return e.has_projects
except:
except Exception:
return False
def check_old_vscode_extension():
"""
Check to see if the old version of the Ren'Py vscode extension is installed.
_("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."),
_("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."),
[
((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.")),
],
(1280, 720),
default_size,
cancel=Jump("front_page"),
)
@@ -362,7 +369,7 @@ label gui_project_size:
try:
gui_width = int(gui_width)
except:
except Exception:
interface.error(_("The width must be a number."), label=None)
continue
break
@@ -378,7 +385,7 @@ label gui_project_size:
try:
gui_height = int(gui_height)
except:
except Exception:
interface.error(_("The height must be a number."), label=None)
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-4-*.zip", patterns)
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-[45]-*.zip", patterns)
jump front_page
screen install():
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():
frame:
style_group "l"
@@ -122,10 +164,6 @@ screen install():
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"):
@@ -137,39 +175,12 @@ screen install():
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-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.")
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.")
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.")
# Copyright 2004-2021 Tom Rothamel <pytom@bishoujo.us>
# 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
@@ -25,34 +25,6 @@ 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:
@@ -63,22 +35,21 @@ label new_project:
$ interface.error(_("The projects directory could not be set. Giving up."))
python:
if persistent.legacy:
new_project_language = __("{#language name and font}")
gui_kind = "new_gui_project"
check_language_support()
# 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"))
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", None), _("Do not use a template project.") ) ] +
[ ( ("new_template_project", p.path ), p.name) for p in project.manager.templates ],
("new_gui_project", None),
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."))
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'.")
new "{b}نقترح.{/b} محرر نص له واجهة سهلة الاستعمال ويعين على كتابة النصوص البرمجية يفضل برنامج يحتوي على مدقق لغوي. Editraحالياً لا يدعم اللغات الأجنبية مثل اللغه الكورية و الصينية و اليابانية. على نظام لينوكس, Editra يحتاج wxPython."
# editor.rpy:167
old "This may have occured because wxPython is not installed on this system."
old "This may have occurred because wxPython is not installed on this system."
new "قد يكون سبب ذلك ان wxPython غير موجود في نظام التشغيل لديك"
# editor.rpy:169
@@ -378,7 +380,7 @@ translate arabic strings:
new "مطلوب تحميل ملف بحجم 1.8 ميغا بايت."
# editor.rpy:182
old "This may have occured because Java is not installed on this system."
old "This may have occurred because Java is not installed on this system."
new "قد يكون السبب ان الجافا غير موجوده على هذا الجهاز."
# editor.rpy:191
@@ -390,7 +392,7 @@ translate arabic strings:
new "يمنع رينباي من فتح اي محرر نصوص"
# editor.rpy:359
old "An exception occured while launching the text editor:\n[exception!q]"
old "An exception occurred while launching the text editor:\n[exception!q]"
new "حصل استثناء اثناء فتح المحرر: \n[exception!q]"
# editor.rpy:457
@@ -562,7 +564,7 @@ translate arabic strings:
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 1280x720 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 [default_size[0]]x[default_size[1]] is a reasonable compromise."
new "ما هو الحجم المطلوب للمشروع؟ رينباي يستطيع تكبير و تصغير حجم النافذة لتناسب الشاشة, لكن الحجم الذي ستختاره هنا هو الحجم القياسي, و الذي ستظهر فيه الصور و الشخصيات في أوضح شكل لها. \n\n الحجم الذي يناسب اغلب الشاشات هو 1280×730 بكسل."
# gui7.rpy:389
@@ -606,7 +608,7 @@ translate arabic strings:
new "خطأ"
# interface.rpy:356
old "While [what!qt], an error occured:"
old "While [what!qt], an error occurred:"
new "حصل خطأ أثناء [what!qt]"
# interface.rpy:356
@@ -1134,7 +1136,7 @@ translate arabic strings:
new "أحدث نسخة طازجة من رينباي التجريبي, قد يحتوي على آخر مستجدات رينباي و قد لا يعمل مطلقاً"
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 "## 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."
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."
# screens.rpy:476
old "Return"
@@ -494,8 +494,8 @@ translate arabic strings:
new "النقر بالزر الأيمن"
# screens.rpy:1062
old "Mouse Wheel Up\nClick Rollback Side"
new "تحريك عجلة الفأرة لأعلى\nClick Rollback Side"
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 occurred 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?"
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}"
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."
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."
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."
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "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?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
@@ -223,7 +224,8 @@ 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}."
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}."
# 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}."
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
@@ -239,7 +241,8 @@ translate finnish strings:
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
# Automatic translation.
new "Yhteydenotto App Storeen\nOdottakaa..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
@@ -315,7 +318,7 @@ translate finnish strings:
# 00gallery.rpy:563
old "Image [index] of [count] locked."
new "[index]. kuva [count]:stä on lukittu"
new "Kuva [index]/[count] on lukittu."
# 00gallery.rpy:583
old "prev"
@@ -333,3 +336,608 @@ 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."
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}✔ 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}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
@@ -177,3 +178,110 @@ 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)."
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 DirectXverkkoasennusohjelma 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,3 +177,133 @@ 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."
old "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## 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."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## 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."
# gui.rpy:21
old "## Colors"
new "## Colors"
new "## Värit"
# gui.rpy:23
old "## The colors of text in the interface."
new "## The colors of text in the interface."
new "## Ikkunan tekstien väritys."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
new "## An accent color used throughout the interface to label and highlight text."
new "## Korostusväri tekstin korostamista sekä merkkausta varten."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
new "## 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ä."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## 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."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
new "## 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ä."
# 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 "## 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."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
new "## The color used for a text button when it cannot be selected."
new "## Tekstipainikkeen käyttämä väri, kun se ei ole valittavissa."
# 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 "## 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."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## The colors used for dialogue and menu choice text."
new "## Värit, joita käytetään dialogin ja valikoiden tekstissä."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fonts and Font Sizes"
new "## Fontit sekä fonttikoot"
# gui.rpy:58
old "## The font used for in-game text."
new "## The font used for in-game text."
new "## Pelin sisäisen tekstin fontti."
# gui.rpy:61
old "## The font used for character names."
new "## The font used for character names."
new "## Hahmojen nimien fontti."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## The font used for out-of-game text."
new "## Pelin ulkoisen tekstin fontti."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## The size of normal dialogue text."
new "## Normaalin dialogitekstin fonttikoko."
# gui.rpy:70
old "## The size of character names."
new "## The size of character names."
new "## Hahmojen nimien fonttikoko."
# gui.rpy:73
old "## The size of text in the game's user interface."
new "## The size of text in the game's user interface."
new "## Pelin käyttöliittymän tekstin koko."
# gui.rpy:76
old "## The size of labels in the game's user interface."
new "## The size of labels in the game's user interface."
new "## Pelin käyttöliittymän otsikoiden koko."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## The size of text on the notify screen."
new "## Tekstin koko ilmoitusikkunassa."
# gui.rpy:82
old "## The size of the game's title."
new "## The size of the game's title."
new "## Pelin nimen fonttikoko."
# gui.rpy:86
old "## Main and Game Menus"
new "## Main and Game Menus"
new "## Pää- ja pelivalikot"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## The images used for the main and game menus."
new "## Pää- ja pelivalikoiden käyttämät kuvat."
# gui.rpy:92
old "## Should we show the name and version of the game?"
new "## Should we show the name and version of the game?"
new "## Tulisiko meidän näyttää pelin nimi ja versio?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogue"
new "## Dialogi"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## 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."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## The height of the textbox containing dialogue."
new "## Dialogi-ikkunan korkeus."
# 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 "## 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."
# 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 "## 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."
# 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 "## 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."
# gui.rpy:118
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## 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."
# gui.rpy:123
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## 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."
# 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 "## 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."
# 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 "## 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."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## The maximum width of dialogue text, in pixels."
new "## Dialogitekstin maksimileveys pikseleinä."
# 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 "## 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."
# gui.rpy:146
old "## Buttons"
new "## Buttons"
new "## Painikkeet"
# gui.rpy:148
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## 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."
# gui.rpy:151
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## 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."
# gui.rpy:155
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## 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."
# gui.rpy:158
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## 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."
# gui.rpy:162
old "## The font used by the button."
new "## The font used by the button."
new "## Painikkeen käyttämä fontti."
# gui.rpy:165
old "## The size of the text used by the button."
new "## The size of the text used by the button."
new "## Painikkeen käyttämä fonttikoko."
# 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 "## 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."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## These customizations are used by the default interface:"
new "## Nämä muokkaukset ovat käytössä oletuskäyttöliittymässä:"
# 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 "## 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."
# gui.rpy:205
old "## Choice Buttons"
new "## Choice Buttons"
new "## Valikon Painikkeet"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Choice buttons are used in the in-game menus."
new "## Nämä muuttujat määrittävät pelin sisäisten valikoiden painikkeiden ominaisuuksia."
# gui.rpy:220
old "## File Slot Buttons"
new "## File Slot Buttons"
new "## Tallennuspaikan Painikkeet"
# 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 "## 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."
# gui.rpy:226
old "## The save slot button."
new "## The save slot button."
new "## Tallennuspaikan painike."
# gui.rpy:234
old "## The width and height of thumbnails used by the save slots."
new "## The width and height of thumbnails used by the save slots."
new "## Tallennuspaikan käyttämien esikatselukuvien leveys ja korkeus."
# gui.rpy:238
old "## The number of columns and rows in the grid of save slots."
new "## The number of columns and rows in the grid of save slots."
new "## Tallennuspaikkojen ruudukon rivien ja sarakkeiden lukumäärä."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Positioning and Spacing"
new "## Sijainti ja Välit"
# gui.rpy:245
old "## These variables control the positioning and spacing of various user interface elements."
new "## 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ä."
# gui.rpy:248
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## 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."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## The vertical position of the skip indicator."
new "## Sivuutusilmaisimen sijainti pystyakselilla."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## The vertical position of the notify screen."
new "## Ilmoitusnäytön sijainti pystyakselilla."
# gui.rpy:258
old "## The spacing between menu choices."
new "## The spacing between menu choices."
new "## Valikon vaihtoehtojen välinen tila."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
new "## Buttons in the navigation section of the main and game menus."
new "## Painikkeiden välinen tila pää- ja pelivalikoissa."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Controls the amount of spacing between preferences."
new "## Hallitsee asetusten välistä etäisyyttä."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Controls the amount of spacing between preference buttons."
new "## Hallitsee asetusten painikkeiden välisiä etäisyyksiä."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## The spacing between file page buttons."
new "## Tyhjä tila tallennussivun painikkeiden välillä."
# gui.rpy:273
old "## The spacing between file slots."
new "## The spacing between file slots."
new "## Tyhjä tila tallennuspaikkojen välillä."
# gui.rpy:277
old "## Frames"
new "## Frames"
new "## Reunat"
# 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 "## 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."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Generic frames that are introduced by player code."
new "## Geneeriset reunat, joita koodi voi luoda."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
new "## The frame that isused as part of the confirm screen."
new "## Varmistusikkunan käyttämä reuna."
# gui.rpy:288
old "## The frame that is used as part of the skip screen."
new "## The frame that is used as part of the skip screen."
new "## Sivuutusikkunan käyttämä reuna."
# gui.rpy:291
old "## The frame that is used as part of the notify screen."
new "## The frame that is used as part of the notify screen."
new "## Ilmoitusikkunan käyttämä reuna."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Should frame backgrounds be tiled?"
new "## Tulisiko kehyksen taustakuvan toistaa itseään?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Bars, Scrollbars, and Sliders"
new "## Palkit, Vierityspalkit, ja Liukuvalinnat"
# gui.rpy:300
old "## These control the look and size of bars, scrollbars, and sliders."
new "## These control the look and size of bars, scrollbars, and sliders."
new "## Nämä muokkaavat palkkien, vierityspalkkien, ja liukuvalintojen ulkonäköä sekä kokoa."
# 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 "## 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ää."
# gui.rpy:305
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Palkkien, vierityspalkkien, ja liukuvalintojen korkeus ja leveys."
# gui.rpy:311
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## 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."
# gui.rpy:316
old "## Horizontal borders."
new "## Horizontal borders."
new "## Vaakatason reunat."
# gui.rpy:321
old "## Vertical borders."
new "## Vertical borders."
new "## Pystysuorat reunat."
# gui.rpy:326
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## 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ä."
# gui.rpy:331
old "## History"
new "## History"
new "## Historia"
# gui.rpy:333
old "## The history screen displays dialogue that the player has already dismissed."
new "## The history screen displays dialogue that the player has already dismissed."
new "## Historia-ikkuna näyttää dialogin, jonka pelaaja on jo lukenut."
# gui.rpy:335
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## The number of blocks of dialogue history Ren'Py will keep."
new "## Määrittää, montako dialogitekstiä Ren'Py pitää muistissaan."
# gui.rpy:338
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## 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."
# gui.rpy:342
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Puhuvan hahmon nimen sijainti, leveys, ja ryhmäytys."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## The position, width, and alignment of the dialogue text."
new "## Dialogitekstin sijainti, leveys, ja ryhmäytys."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Mode"
new "## NVL-Tila"
# gui.rpy:358
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## NVL-tilan näyttö näyttää NVL-tilan hahmojen dialogin."
# gui.rpy:360
old "## The borders of the background of the NVL-mode background window."
new "## The borders of the background of the NVL-mode background window."
new "## NVL-tilan ikkunan taustan reunat."
# gui.rpy:363
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## 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."
# 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 "## 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."
# gui.rpy:384
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## The position, width, and alignment of nvl_thoughttext (the text said by the nvl_narrator character.)"
new "## nvl_thought-tekstin sijainti, leveys, ja ryhmäytys (nvl_narrator-hahmon puhuma teksti.)"
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## The position of nvl menu_buttons."
new "## NVL-valikon painikkeiden sijainti."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## 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ää."
# gui.rpy:409
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## 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."
# gui.rpy:413
old "## Font sizes."
new "## Font sizes."
new "## Fonttikoot."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Adjust the location of the textbox."
new "## Säädä teksti-ikkunan sijaintia."
# gui.rpy:427
old "## Change the size and spacing of items in the game menu."
new "## Change the size and spacing of items in the game menu."
new "## Mukauta pelivalikon elementtien kokoa ja sijaintia."
# gui.rpy:436
old "## File button layout."
new "## File button layout."
new "## Tallennusvalikon painikkeen asettelu."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-mode."
new "## NVL-tila."
# gui.rpy:456
old "## Quick buttons."
new "## 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."
old "## This file contains options that can be changed to customize your game."
new "## 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."
# 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 "## 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."
# options.rpy:10
old "## Basics"
new "## Basics"
new "## Perusteet"
# 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 "## 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."
# options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## The _() surrounding the string marks it as eligible for translation."
new "## _() merkkijonon ympärillä merkitsee sen soveltuvaksi käännöksille."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 Default GUI"
new "Ren'Py 7 Oletusarvoinen 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 "## 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."
# options.rpy:26
old "## The version of the game."
new "## The version of the game."
new "## Pelin versio."
# 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 "## 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."
# 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 "## 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ä."
# options.rpy:44
old "## Sounds and music"
new "## Sounds and music"
new "## Äänet ja musiikki"
# 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 "## 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."
# 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 "## 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."
# 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 "## 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."
# options.rpy:69
old "## Transitions"
new "## Transitions"
new "## Siirtymät"
# 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 "## 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ää."
# options.rpy:75
old "## Entering or exiting the game menu."
new "## Entering or exiting the game menu."
new "## Pelivalikon avaaminen ja sulkeminen."
# options.rpy:81
old "## A transition that is used after a game has been loaded."
new "## A transition that is used after a game has been loaded."
new "## Siirtymä, jota käytetään kun peli on ladattu."
# options.rpy:86
old "## Used when entering the main menu after the game has ended."
new "## Used when entering the main menu after the game has ended."
new "## Käytetään siirryttäessä päävalikkoon pelin päätyttyä."
# 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 "## 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."
# options.rpy:96
old "## Window management"
new "## Window management"
new "## Ikkunanhallinta"
# 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 "## 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ä."
# options.rpy:103
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## 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."
# options.rpy:109
old "## Transitions used to show and hide the dialogue window"
new "## Transitions used to show and hide the dialogue window"
new "## Siirtymät, joita käytetään dialogi-ikkunan näytössä ja piilotuksessa"
# options.rpy:115
old "## Preference defaults"
new "## Preference defaults"
new "## Asetusten oletusarvot"
# 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 "## 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."
# options.rpy:123
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## 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."
# options.rpy:129
old "## Save directory"
new "## Save directory"
new "## Tallennuskansio"
# 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 "## 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:"
# options.rpy:134
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
@@ -131,65 +131,93 @@ 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 "## 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."
# options.rpy:146
old "## Icon ########################################################################'"
new "## Icon ########################################################################'"
new "## Ikoni #######################################################################'"
# options.rpy:148
old "## The icon displayed on the taskbar or dock."
new "## The icon displayed on the taskbar or dock."
new "## Tehtäväpalkissa tai työpöydällä näkyvä ikoni."
# options.rpy:153
old "## Build configuration"
new "## Build configuration"
new "## Jakeluasetukset"
# options.rpy:155
old "## This section controls how Ren'Py turns your project into distribution files."
new "## 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."
# 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 "## 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."
# options.rpy:165
old "## In a pattern:"
new "## In a pattern:"
new "## Mallin syntaksi:"
# options.rpy:167
old "## / is the directory separator."
new "## / is the directory separator."
new "## / on kansioiden erotin."
# options.rpy:169
old "## * matches all characters, except the directory separator."
new "## * matches all characters, except the directory separator."
new "## * täsmää kaikkiin merkkeihin, paitsi kansion erottimeen."
# options.rpy:171
old "## ** matches all characters, including the directory separator."
new "## ** matches all characters, including the directory separator."
new "## ** täsmää kaikkiin merkkeihin, mukaan lukien kansion erottimeen."
# 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 "## 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."
# options.rpy:177
old "## Classify files as None to exclude them from the built distributions."
new "## Classify files as None to exclude them from the built distributions."
new "## Luokittele tiedostot arvolla None jättääksesi ne pois kootuista jakeluista."
# options.rpy:185
old "## To archive files, classify them as 'archive'."
new "## To archive files, classify them as 'archive'."
new "## Arkistoidaksesi tiedostoja, luokittele ne arvolla '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 "## 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."
# 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 "## 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."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## The username and project name associated with an itch.ioproject, 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\"."
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 "## 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 whoparameter 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.)"
# 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 "## 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."
# 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 "## Input screen"
new "## Syötenäyttö"
# screens.rpy:171
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## This screen is used to display renpy.input. The promptparameter 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."
# screens.rpy:174
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## 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ä."
# 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 "## Choice screen"
new "## Valintanäyttö"
# 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 "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, isa 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."
# 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 "## 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."
# screens.rpy:244
old "## Quick Menu screen"
new "## Quick Menu screen"
new "## Pikavalikkonäyttö"
# screens.rpy:246
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## 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."
# screens.rpy:261
old "Back"
@@ -71,11 +71,12 @@ translate finnish strings:
# screens.rpy:262
old "History"
new "History"
new "Historia"
# screens.rpy:263
old "Skip"
new "Skip"
# Automatic translation.
new "Ohita"
# screens.rpy:264
old "Auto"
@@ -83,51 +84,51 @@ translate finnish strings:
# screens.rpy:265
old "Save"
new "Save"
new "Tallenna"
# screens.rpy:266
old "Q.Save"
new "Q.Save"
new "P.Tallenna"
# screens.rpy:267
old "Q.Load"
new "Q.Load"
new "P.Lataa"
# screens.rpy:268
old "Prefs"
new "Prefs"
new "Asetukset"
# 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 "## 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."
# screens.rpy:291
old "## Navigation screen"
new "## Navigation screen"
new "## Siirtymänäyttö"
# 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 "## 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."
# screens.rpy:308
old "Start"
new "Start"
new "Aloita"
# screens.rpy:316
old "Load"
new "Load"
new "Lataa"
# screens.rpy:318
old "Preferences"
new "Preferences"
new "Asetukset"
# screens.rpy:322
old "End Replay"
new "End Replay"
new "Päätä Toisto"
# screens.rpy:326
old "Main Menu"
new "Main Menu"
new "Päävalikko"
# screens.rpy:328
old "About"
@@ -135,15 +136,15 @@ translate finnish strings:
# screens.rpy:332
old "## Help isn't necessary or relevant to mobile devices."
new "## Help isn't necessary or relevant to mobile devices."
new "## Ohje ei ole tarpeellinen tai oleellinen mobiililaitteilla."
# screens.rpy:333
old "Help"
new "Help"
new "Ohje"
# screens.rpy:335
old "## The quit button is banned on iOS and unnecessary on Android."
new "## The quit button is banned on iOS and unnecessary on Android."
new "## Poistu-painike on kielletty iOS-laitteilla, ja tarpeeton Android-laitteilla."
# screens.rpy:336
old "Quit"
@@ -151,11 +152,11 @@ translate finnish strings:
# screens.rpy:350
old "## Main Menu screen"
new "## Main Menu screen"
new "## Päävalikkonäkymä"
# screens.rpy:352
old "## Used to display the main menu when Ren'Py starts."
new "## Used to display the main menu when Ren'Py starts."
new "## Käytetään päävalikon näyttämiseksi Ren'Py:n käynnistyessä."
# screens.rpy:354
old "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
@@ -163,19 +164,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 "## 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öä."
# screens.rpy:413
old "## Game Menu screen"
new "## Game Menu screen"
new "## Pelivalikkonäkymä"
# 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 "## 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."
# 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 "## The scrollparameter 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."
# screens.rpy:476
old "Return"
@@ -183,43 +184,43 @@ translate finnish strings:
# screens.rpy:539
old "## About screen"
new "## About screen"
new "## Tietoja-näyttö"
# screens.rpy:541
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## 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ä."
# 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 "## 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ä."
# 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 "## 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."
# screens.rpy:561
old "Version [config.version!t]\n"
new "Version [config.version!t]\n"
new "Versio [config.version!t]\n"
# screens.rpy:563
old "## gui.about is usually set in options.rpy."
new "## gui.about is usually set in options.rpy."
new "## gui.about asetetaan yleensä tiedostossa 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 "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]"
# screens.rpy:570
old "## This is redefined in options.rpy to add text to the about screen."
new "## 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."
# screens.rpy:582
old "## Load and Save screens"
new "## Load and Save screens"
new "## Lataa ja Tallenna -näytöt"
# 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 "## 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."
# screens.rpy:588
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
@@ -239,11 +240,11 @@ translate finnish strings:
# screens.rpy:613
old "## This ensures the input will get the enter event before any of the buttons do."
new "## 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."
# screens.rpy:629
old "## The grid of file slots."
new "## The grid of file slots."
new "## Tallennuspaikkojen taulukko."
# screens.rpy:649
old "{#file_time}%A, %B %d %Y, %H:%M"
@@ -251,11 +252,11 @@ translate finnish strings:
# screens.rpy:649
old "empty slot"
new "empty slot"
new "tyhjä paikka"
# screens.rpy:657
old "## Buttons to access other pages."
new "## Buttons to access other pages."
new "## Painikkeita muille sivuille pääsyä varten."
# screens.rpy:666
old "<"
@@ -275,11 +276,11 @@ translate finnish strings:
# screens.rpy:711
old "## Preferences screen"
new "## Preferences screen"
new "## Asetukset-näyttö"
# screens.rpy:713
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## 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."
# screens.rpy:716
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
@@ -299,7 +300,7 @@ translate finnish strings:
# screens.rpy:744
old "Rollback Side"
new "Rollback Side"
new "Palautussivu"
# screens.rpy:745
old "Disable"
@@ -307,63 +308,63 @@ translate finnish strings:
# screens.rpy:746
old "Left"
new "Left"
new "Vasen"
# screens.rpy:747
old "Right"
new "Right"
new "Oikea"
# screens.rpy:752
old "Unseen Text"
new "Unseen Text"
new "Lukematon Teksti"
# screens.rpy:753
old "After Choices"
new "After Choices"
new "Päätösten Jälkeen"
# screens.rpy:754
old "Transitions"
new "Transitions"
new "Siirtymät"
# screens.rpy:756
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## 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."
# screens.rpy:767
old "Text Speed"
new "Text Speed"
new "Tekstin Nopeus"
# screens.rpy:771
old "Auto-Forward Time"
new "Auto-Forward Time"
new "Automaattisen Jatkamisen Viive"
# screens.rpy:778
old "Music Volume"
new "Music Volume"
new "Musiikin Äänenvoimakkuus"
# screens.rpy:785
old "Sound Volume"
new "Äänenvoimakkuus"
new "Ääniefektien Äänenvoimakkuus"
# screens.rpy:791
old "Test"
new "Test"
new "Kokeile"
# screens.rpy:795
old "Voice Volume"
new "Voice Volume"
new "Puheen Äänenvoimakkuus"
# screens.rpy:806
old "Mute All"
new "Mute All"
new "Mykistä Kaikki"
# screens.rpy:882
old "## History screen"
new "## History screen"
new "## Historia-näyttö"
# 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 "## 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."
# screens.rpy:888
old "## https://www.renpy.org/doc/html/history.html"
@@ -371,35 +372,35 @@ translate finnish strings:
# screens.rpy:894
old "## Avoid predicting this screen, as it can be very large."
new "## Avoid predicting this screen, as it can be very large."
new "## Vältä ennustamasta tätä näyttöä, sillä se voi olla hyvin suuri."
# screens.rpy:905
old "## This lays things out properly if history_height is None."
new "## This lays things out properly if history_height is None."
new "## Tämä asettelee dialogin kunnnolla, jos history_height on None."
# screens.rpy:914
old "## Take the color of the who text from the Character, if set."
new "## Take the color of the whotext from the Character, if set."
new "## Ota väri hahmon who-tekstistä, jos asetettu."
# screens.rpy:921
old "The dialogue history is empty."
new "The dialogue history is empty."
new "Dialogihistoria on tyhjä."
# screens.rpy:965
old "## Help screen"
new "## Help screen"
new "## Ohje-näyttö"
# 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 "## 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."
# screens.rpy:986
old "Keyboard"
new "Keyboard"
new "Näppäimistö"
# screens.rpy:987
old "Mouse"
new "Mouse"
new "Hiiri"
# screens.rpy:990
old "Gamepad"
@@ -407,35 +408,36 @@ translate finnish strings:
# screens.rpy:1003
old "Enter"
new "Enter"
# Automatic translation.
new "Kirjoita"
# screens.rpy:1004
old "Advances dialogue and activates the interface."
new "Advances dialogue and activates the interface."
new "Jatkaa dialogia ja aktivoi valittuja toimintoja."
# screens.rpy:1007
old "Space"
new "Space"
new "Välilyönti"
# screens.rpy:1008
old "Advances dialogue without selecting choices."
new "Advances dialogue without selecting choices."
new "Jatkaa dialogia tekemättä päätöksiä."
# screens.rpy:1011
old "Arrow Keys"
new "Arrow Keys"
new "Nuolinäppäimet"
# screens.rpy:1012
old "Navigate the interface."
new "Navigate the interface."
new "Liiku käyttöliittymässä."
# screens.rpy:1015
old "Escape"
new "Escape"
new "Esc"
# screens.rpy:1016
old "Accesses the game menu."
new "Accesses the game menu."
new "Avaa ja sulkee pelivalikon."
# screens.rpy:1019
old "Ctrl"
@@ -443,99 +445,100 @@ translate finnish strings:
# screens.rpy:1020
old "Skips dialogue while held down."
new "Skips dialogue while held down."
new "Sivuuttaa dialogin pidettäessä painettuna."
# screens.rpy:1023
old "Tab"
new "Tab"
new "Sarkain"
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Toggles dialogue skipping."
new "Asettaa dialogin sivuutuksen päälle ja pois."
# screens.rpy:1027
old "Page Up"
new "Page Up"
# Automatic translation.
new "Sivu ylös"
# screens.rpy:1028
old "Rolls back to earlier dialogue."
new "Rolls back to earlier dialogue."
new "Siirtyy takaisin aiempaan dialogiin."
# screens.rpy:1031
old "Page Down"
new "Page Down"
new "Siirtyy uudempaan dialogiin."
# screens.rpy:1032
old "Rolls forward to later dialogue."
new "Rolls forward to later dialogue."
new "Vierittää kohti uudempaa dialogia."
# screens.rpy:1036
old "Hides the user interface."
new "Hides the user interface."
new "Piilottaa käyttöliittymän."
# screens.rpy:1040
old "Takes a screenshot."
new "Takes a screenshot."
new "Ottaa näytönkaappauksen."
# screens.rpy:1044
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "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."
# screens.rpy:1050
old "Left Click"
new "Left Click"
new "Hiiren Vasen Painike"
# screens.rpy:1054
old "Middle Click"
new "Middle Click"
new "Hiiren Keskipainike"
# screens.rpy:1058
old "Right Click"
new "Right Click"
new "Hiiren Oikea Painike"
# screens.rpy:1062
old "Mouse Wheel Up\nClick Rollback Side"
new "Mouse Wheel Up\nClick Rollback Side"
old "Mouse Wheel Up"
new "Hiiren Rulla Ylös"
# screens.rpy:1066
old "Mouse Wheel Down"
new "Mouse Wheel Down"
new "Hiiren Rulla Alas"
# screens.rpy:1073
old "Right Trigger\nA/Bottom Button"
new "Right Trigger\nA/Bottom Button"
new "Oikea Liipaisin\nA/Alapainike"
# screens.rpy:1074
old "Advance dialogue and activates the interface."
new "Advance dialogue and activates the interface."
new "Jatka dialogia ja aktivoi valittuja toimintoja."
# screens.rpy:1078
old "Roll back to earlier dialogue."
new "Roll back to earlier dialogue."
new "Siirtyy takaisin aiempaan dialogiin."
# screens.rpy:1081
old "Right Shoulder"
new "Right Shoulder"
new "Oikea Olkapainike"
# screens.rpy:1082
old "Roll forward to later dialogue."
new "Roll forward to later dialogue."
new "Vieritä kohti uudempaa dialogia."
# screens.rpy:1085
old "D-Pad, Sticks"
new "D-Pad, Sticks"
new "Ristiohjain, Tikut"
# screens.rpy:1089
old "Start, Guide"
new "Start, Guide"
new "Start, Opas"
# screens.rpy:1090
old "Access the game menu."
new "Access the game menu."
new "Avaa ja sulje pelivalikko."
# screens.rpy:1093
old "Y/Top Button"
new "Y/Top Button"
new "Y/Yläpainike"
# screens.rpy:1096
old "Calibrate"
@@ -543,15 +546,15 @@ translate finnish strings:
# screens.rpy:1124
old "## Additional screens"
new "## Additional screens"
new "## Ylimääräisiä näyttöjä"
# screens.rpy:1128
old "## Confirm screen"
new "## Confirm screen"
new "## Vahvistusikkuna"
# screens.rpy:1130
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## 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."
# screens.rpy:1133
old "## http://www.renpy.org/doc/html/screen_special.html#confirm"
@@ -559,7 +562,7 @@ translate finnish strings:
# screens.rpy:1137
old "## Ensure other screens do not get input while this screen is displayed."
new "## 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ä."
# screens.rpy:1161
old "Yes"
@@ -571,15 +574,15 @@ translate finnish strings:
# screens.rpy:1164
old "## Right-click and escape answer \"no\"."
new "## Right-click and escape answer \"no\"."
new "## Hiiren oikea painike ja Esc antavat vastauksen \"ei\"."
# screens.rpy:1191
old "## Skip indicator screen"
new "## Skip indicator screen"
new "## Sivuutusilmaisin-näyttö"
# screens.rpy:1193
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## 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ä."
# screens.rpy:1196
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
@@ -587,19 +590,19 @@ translate finnish strings:
# screens.rpy:1208
old "Skipping"
new "Skipping"
new "Sivuutetaan dialogia"
# screens.rpy:1215
old "## This transform is used to blink the arrows one after another."
new "## This transform is used to blink the arrows one after another."
new "## Tätä muutosta käytetään nuolten vilkkumiseen toistensa perään."
# screens.rpy:1247
old "## Notify screen"
new "## Notify screen"
new "## Ilmoitusnäyttö"
# 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 "## 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.)"
# screens.rpy:1252
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
@@ -607,11 +610,11 @@ translate finnish strings:
# screens.rpy:1286
old "## NVL screen"
new "## NVL screen"
new "## NVL-näyttö"
# screens.rpy:1288
old "## This screen is used for NVL-mode dialogue and menus."
new "## This screen is used for NVL-mode dialogue and menus."
new "## Tätä näyttöä käytetään NVL-tilan dialogiin ja valikoihin."
# screens.rpy:1290
old "## http://www.renpy.org/doc/html/screen_special.html#nvl"
@@ -619,25 +622,155 @@ translate finnish strings:
# screens.rpy:1301
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Displays dialogue in either a vpgrid or the vbox."
new "## Näyttää dialogin joko vpgridissä tai vboxissa."
# 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 "## 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ä."
# screens.rpy:1344
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## 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."
# screens.rpy:1406
old "## Mobile Variants"
new "## Mobile Variants"
new "## Mobiiliversiot"
# 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 "## 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."
# screens.rpy:1429
old "Menu"
new "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 "Montrer le log ne chargement des images (F4)"
new "Afficher le log de chargement des images (F4)"
# renpy/common/_developer/developer.rpym:60
old "Hide Image Load Log (F4)"
@@ -760,7 +759,7 @@ translate french strings:
# renpy/common/_developer/developer.rpym:506
old "Type to filter: "
new "Type à filtrer : "
new "Écrire pour filtrer : "
# renpy/common/_developer/developer.rpym:631
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
@@ -785,3 +784,127 @@ translate french strings:
# 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 ."
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 (bon){/color}\n{color=#fcc}✘ image prédite (mauvais){/color}\n{color=#fff}Glissez pour bouger.{/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}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
new "Inspecteur affichable"
new "Inspecteur de displayables"
# _developer/inspector.rpym:61
old "Size"
@@ -98,11 +102,11 @@
# _developer/inspector.rpym:139
old "displayable:"
new "affichable :"
new "displayable :"
# _developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (Aucune propriété n’affecte l’affichage)"
new " (Aucune propriété ne s'applique au displayable)"
# _developer/inspector.rpym:147
old " (default properties omitted)"
@@ -114,7 +118,7 @@
# 00console.rpy:182
old "Press <esc> to exit console. Type help for help.\n"
new "Pressez « Echap » pour quitter la console. Pressez « Aide » pour afficher l’aide.\n"
new "Appuyez sur Échap pour quitter la console. Écrivez help pour afficher l’aide.\n"
# 00console.rpy:186
old "Ren'Py script enabled."
@@ -124,9 +128,13 @@
old "Ren'Py script disabled."
new "Script Ren'Py désactivé."
# 00console.rpy:398
old "help: show this help"
new "aide: Afficher cette aide"
# 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:403
old "commands:\n"
@@ -134,15 +142,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 " <python expression or statement> : Exécuter cette expression ou cette déclaration"
new " <expression ou instruction python> : exécuter cette expression ou cette instruction"
# 00console.rpy:423
old "clear: clear the console history"
new "clear: Purger l’historique de la console"
new "clear: effacer l’historique de la console"
# 00console.rpy:427
old "exit: exit the console"
@@ -158,7 +166,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"
@@ -178,7 +186,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)."
@@ -195,3 +203,11 @@
# 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)."
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."
new "{font=fonts/Roboto-Light.ttf}Français{/font}"
# about.rpy:39
old "[version!q]"
@@ -38,7 +41,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. Choisissez « installer le kit de développement et créer les clés » pour cela."
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 »."
# android.rpy:33
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
@@ -62,11 +65,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\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."
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."
# 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 supportés. 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 requis. 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."
@@ -106,7 +109,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:"
@@ -206,7 +209,8 @@
# choose_theme.rpy:370
old "Planetarium"
new "Planetarium"
# Automatic translation.
new "Planétarium"
# choose_theme.rpy:425
old "Choose Theme"
@@ -306,7 +310,7 @@
# distribute_gui.rpy:194
old "Add from clauses to calls, once"
new "Add from clauses to calls, once"
new "Ajouter des \"from\" aux \"call\""
# distribute_gui.rpy:195
old "Refresh"
@@ -314,7 +318,7 @@
# distribute_gui.rpy:199
old "Upload to itch.io"
new "Télécharger (upload) sur itch.io"
new "Uploader sur itch.io"
# distribute_gui.rpy:215
old "Build Packages:"
@@ -330,7 +334,7 @@
# distribute_gui.rpy:241
old "Add from clauses to calls"
new "Add from clauses to calls"
new "Ajouter des \"from\" aux \"call\""
# distribute_gui.rpy:242
old "Force Recompile"
@@ -342,7 +346,7 @@
# distribute_gui.rpy:250
old "Adding from clauses to call statements that do not have them."
new "Adding from clauses to call statements that do not have them."
new "Ajout de \"from\" aux \"call\" qui n'en ont pas."
# distribute_gui.rpy:271
old "Errors were detected when running the project. Please ensure the project runs without errors before building distributions."
@@ -361,7 +365,7 @@
new "{b}Recommandé.{/b} Un éditeur en version beta avec une interface simple et des fonctionnalités d’assistance au développement. Editra manque pour le moment du support pour les textes en chinois, japonais et coréen. Sur GNU-Linux, Editra nécessite wxPython."
# editor.rpy:167
old "This may have occured because wxPython is not installed on this system."
old "This may have occurred because wxPython is not installed on this system."
new "Cela est sans doute dû au fait que wxPython n’est pas installé sur votre système."
# editor.rpy:169
@@ -377,7 +381,7 @@
new "1.8 Mo de téléchargement requis."
# editor.rpy:182
old "This may have occured because Java is not installed on this system."
old "This may have occurred because Java is not installed on this system."
new "Cela est sans doute produit parce que Java n’est pas installé sur ce système."
# editor.rpy:191
@@ -389,7 +393,7 @@
new "Empêcher Ren’Py d’ouvrir un éditeur de texte."
# editor.rpy:359
old "An exception occured while launching the text editor:\n[exception!q]"
old "An exception occurred while launching the text editor:\n[exception!q]"
new "Une exception est survenue lors du lancement de l’éditeur de texte :\n[exception!q]"
# editor.rpy:457
@@ -410,7 +414,7 @@
# front_page.rpy:93
old "refresh"
new "rafraichir"
new "rafraîchir"
# front_page.rpy:120
old "+ Create New Project"
@@ -470,7 +474,7 @@
# front_page.rpy:223
old "Navigate Script"
new "Naviguer dans le script"
new "Parcourir le script"
# front_page.rpy:234
old "Check Script (Lint)"
@@ -561,8 +565,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 1280x720 is a reasonable compromise."
new "Quelle résolution souhaitez-vous utiliser pour votre projet? Même si Ren’Py peut agrandir ou diminuer les fenêtres et leurs images à l’échelle, il s’agit 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."
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 Ren’Py peut agrandir ou diminuer les fenêtres et leurs images à l’échelle, il s’agit 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."
# gui7.rpy:389
old "Creating the new project..."
@@ -605,7 +609,7 @@
new "ERREUR"
# interface.rpy:356
old "While [what!qt], an error occured:"
old "While [what!qt], an error occurred:"
new "Pendant que [what!qt], une erreur est survenue:"
# interface.rpy:356
@@ -654,11 +658,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 "Tentatives pour émuler un iPhone.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
new "Tentative d'é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 "Tentatives pour émuler un iPad.\n\nLe contact tactile est émulé via la souris, mais seulement si le bouton est maintenu pressé."
new "Tentative d'é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."
@@ -686,7 +690,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"
@@ -742,7 +746,7 @@
# itch.rpy:99
old "The butler program was not found."
new "Le programme coordonnateur(butler) n'a pas été trouvé."
new "Le programme butler n'a pas été trouvé."
# itch.rpy:99
old "Please install the itch.io app, which includes butler, and try again."
@@ -886,7 +890,7 @@
# preferences.rpy:111
old "Text Editor:"
new "Éditeur:"
new "Éditeur de texte:"
# preferences.rpy:117
old "Text editor: [text]"
@@ -894,7 +898,7 @@
# preferences.rpy:133
old "Update Channel:"
new "Version"
new "Type de version :"
# preferences.rpy:153
old "Navigation Options:"
@@ -922,7 +926,7 @@
# preferences.rpy:174
old "Show edit file section"
new "Afficher la section d’édition de fichier"
new "Afficher la section d’édition de fichiers"
# preferences.rpy:175
old "Large fonts"
@@ -930,11 +934,11 @@
# preferences.rpy:178
old "Console output"
new "Sortie console"
new "Console de sortie"
# preferences.rpy:199
old "Open launcher project"
new "Ouvrir le projet lanceur"
new "Ouvrir le projet du lanceur"
# preferences.rpy:213
old "Language:"
@@ -994,7 +998,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 (tiret bas)."
new "Le langage avec lequel travailler. Cette valeur ne doit contenir que des caractères ASCII en minuscules et des underscores."
# translations.rpy:130
old "Generate empty strings for translations"
@@ -1022,7 +1026,7 @@
# translations.rpy:180
old "Update Default Interface Translations"
new "Met à jour la traduction de l'interface par défaut"
new "Mise à jour de la traduction par défaut de l'interface"
# 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."
@@ -1054,11 +1058,11 @@
# translations.rpy:282
old "Updating default interface translations..."
new "Mise à jour en cours de la traduction de l’interface par défaut..."
new "Mise à jour de la traduction par défaut de l’interface en cours..."
# translations.rpy:306
old "Extract Dialogue: [project.current.name!q]"
new "Extraire le dialogue: [project.current.name!q]"
new "Extraire les dialogues: [project.current.name!q]"
# translations.rpy:322
old "Format:"
@@ -1066,7 +1070,7 @@
# translations.rpy:330
old "Tab-delimited Spreadsheet (dialogue.tab)"
new "Feuille de calcul avec pour séparateur des tabulations (dialogue.tab)"
new "Feuille de calcul avec des tabulations comme séparateur (dialogue.tab)"
# translations.rpy:331
old "Dialogue Text Only (dialogue.txt)"
@@ -1074,11 +1078,11 @@
# translations.rpy:344
old "Strip text tags from the dialogue."
new "Retire les tags (balises) des dialogues."
new "Retire les text tags (balises) des dialogues."
# translations.rpy:345
old "Escape quotes and other special characters."
new "Protège (escape) les apostrophes et les autres caractères spéciaux."
new "Protège (échappe) les apostrophes et les autres caractères spéciaux."
# translations.rpy:346
old "Extract all translatable strings, not just dialogue."
@@ -1098,11 +1102,19 @@
# 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 Ren’Py qui sera téléchargée. S’il vous plaît, sélectionnez un canal de mise à jour:"
new "Le canal de mise à jour détermine la version de Ren’Py qui sera téléchargée. Sélectionnez un canal de mise à jour:"
# updater.rpy:91
old "Release"
new "Version actuelle."
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)"
# updater.rpy:97
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
@@ -1110,7 +1122,15 @@
# updater.rpy:102
old "Prerelease"
new "Version de test"
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)"
# 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."
@@ -1126,14 +1146,38 @@
# updater.rpy:126
old "Nightly"
new "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)"
# updater.rpy:132
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Les toutes dernières version de Ren’Py encore en développement. Vous pouvez alors utiliser les toutes dernières fonctionnalités, mais le logiciel peut également ne pas s’exécuter du tout."
new "La toute dernière version de Ren’Py, 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."
# updater.rpy:152
old "An error has occured:"
old "An error has occurred:"
new "Une erreur est survenue :"
# updater.rpy:154
@@ -1189,16 +1233,16 @@
new "Le nom de fichier ne peut pas être vide."
# game/android.rpy:31
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."
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."
# 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 release 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 stable 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 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."
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."
# game/android.rpy:313
old "Android: [project.current.display_name!q]"
@@ -1274,7 +1318,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."
@@ -1546,7 +1590,7 @@
# game/gui7.rpy:339
old "Custom. The GUI is optimized for a 16:9 aspect ratio."
new "Personnalisé. Le GUI est optimié pour un ratio de cadre 16:9."
new "Personnalisé. Le GUI est optimisé pour un ratio de cadre 16:9."
# game/gui7.rpy:355
old "WIDTH"
@@ -1590,7 +1634,7 @@
# game/install.rpy:110
old "Install Libraries"
new "Installer les Bibliothèques"
new "Installer des 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."
@@ -1610,7 +1654,7 @@
# game/install.rpy:151
old "Install Steam Support"
new "Installer le upport Steam"
new "Installer le support Steam"
# game/install.rpy:160
old "Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}."
@@ -1626,7 +1670,7 @@
# game/interface.rpy:136
old "Ren'Py Sponsor Information"
new "Information sur les sponsors de Ren'Py Sponsor"
new "Informations sur les sponsors de Ren'Py"
# game/interface.rpy:372
old "opening the log file"
@@ -1654,7 +1698,7 @@
# game/preferences.rpy:145
old "Reset window size"
new "Réinisialiser la taille de la fenêtre"
new "Réinitialiser la taille de la fenêtre"
# game/preferences.rpy:188
old "Force new tutorial"
@@ -1871,3 +1915,255 @@
# 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é n’a é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."
new "## Les fichiers correspondant au format de documentation sont dupliqués pour les compilation sur Mac, c'est pourquoi ils apparaissent deux fois dans l’archive zip."
# 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 "## 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."
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\"."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## 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."
# 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 "## 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."
# 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 "## 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\"."
# 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 "## 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."
# 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 "## 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."
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."
# 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ésactives les «sauts des dialogues»."
new "Active ou désactive 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, as it is above."
new "## Si fourni, affiche le menu. Le menu peut s’afficher de manière incorrecte si config.narrator_menu est initialisé à True, comme c’est le cas au-dessus."
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 s’afficher de manière incorrecte si config.narrator_menu est initialisé à True."
# 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\nClick Rollback Side"
new "Molette vers le haut\nClic sur le côté du Rollback"
old "Mouse Wheel Up"
new "Molette vers le haut"
# gui/game/screens.rpy:1078
old "Left Trigger\nLeft Shoulder"
@@ -719,3 +719,23 @@
# 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"
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.