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.
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.
We don't support subpixel, sure, but this is faster and more "correct" if any absolute finds its way through.
Also there's no need to cast to int if we're doing it afterwards anyway.
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 ensures that the reference counting gc can reclaim
renders quickly. While the main motivation is to make sure
textures are collected before the texture loader is reset,
this should also prevent GC pauses.
If music is currently playing it will pause, otherwise it will resume from where it stopped.
In case a music has already finished, the queue will play the music again from the beginning the next time it is called.
If the music is playing the button will receive the selected status and when paused it will be removed.
Note:
__MusicRoomTogglePause is based on __MusicRoomStop, because in some tests in my project, if __MusicRoomTogglePause was the same as __MusicRoomTogglePlay it caused some data about the music being played added with add(action=[SetVariable("jb_title", title)]), such as the music name, artist and the music image, not to be displayed.
Now, the layers are read with the displayable closest to the player
first, as it's likely to be the most relevant. This would control
the order in which screens are read, but not the screen itself,
as the screen should be read first to last.
This fixes an issue introduced by #3105, where it became
possible for LayeredImage._choose_attributes to return
None if a nonexistent attribute was given to optional,
as might be the case when switching between semi-related
sets of attributes.
* Remove animation of update indicator. (An annoyance if the creator
wants to be informed, but isn't ready to update.)
* Check for updates in a different thread. (Prevents slow internet
from blocking launcher start.)
* Use requests to check update channels.
This isn't great, as the fix is to do a render to texture,
and then subsurface that. Still, the transition from perspective
to no perspective should be rare-ish, and this allows transitions
and other things that need to subsurface to work, rather than
failing entirely.
Fixes#2998.
This introduces a new displayable, MatchTimes that passes st and at
to an adjusttimes inside it. This has the effect of undoing the
timing changes that are caused by the transforms in the layer
at list, and making the timing match the transition.
Applies the function when checking a recognised image, and stashes the
original name so that the error report will match the line in the script
being referenced (rather than reporting the adjusted version).
This is mainly for selected_hover and selected_idle, which will
become hover and idle if not handled, matching the way these prefixes
are handled in the rest of Ren'Py.
Fixes#2957.
This introduces the ability for a character to define its own
statement_name, and uses that ability to create a new statement
that keeps the dialogue window hidden.
This is used by the console to prevent the changes the console
makes from being elimiated when the creator rolls back to the
statement where the changes have been made.
While stuck in an infinite loop during saving, trying to break from it with a keyboard interrupt causes a crash because that exception args is an empty tuple, so we get an uncaught exception here, this checks that looking args[0] or args[1:] won't lead to a crash.
This means that each transform will get at least one shot to
update the state before replacement, such that showing a
transform and immediately replacing it has an effect.
Fixes#2914.
This was broken by some rollbacks, especially the sort of minimal rollbacks
that hapened in the console. This would cause the game to lose some
rollback information immediately after a rollback, causing problems.
Fixes#2907.
There seems to be a problem with Apple's OpenGL implementation
where it will crash during a dissolve transform. Documenting
this for now to get 7.4.7 out the door.
This means that in the usual case where it's not set, it doesn't
get forced to (0, 0), which fails in the case of a button inside
a viewport.
Fixes#2910.
This makes it similar to most other images Ren'Py loads, which
have this sort of padding.
An attempt to address #2847, without being able to repeat it.
If buttons with keyboard_focus True are shown but the first focusable element has keyboard_focus False, the focus_nearest function would focus on that first element when not focused on anything. This commit fixes that.
This works around a problem on windows where the windows+space
combination changes the keymap, and hence the lifting of the
windows key is not detected.
Fixes#2849.
The main issue was basically that xmaxmium was applied twice,
first in renpy.display.render.render, and then again in Window.render.
There was also a problem with xminimum, which would be scaled to
the smaller xmaximum.
Fixes#2890.
These methods don't do much in the current Ren'Py. ATL
images are predicted by .visit(), while Transform's child is set
when it's added. The only think it's used for is setting the
default_transform's state, and that was fixed by a direct call
to update_state.()
What's more, _show() has caused problems, first #2834, and now
Almost all places where Ren'Py autosaves have a configuration variable that can be set to False to prevent Ren'Py from autosaving at that time. The exception is the input function. This commit creates a new config variable autosave_on_input which can be set to False to disable autosaving when players input text.
This fixes a class of problem that could be caused by mixing
show and hide in a single operation, with the copy during hide
stopping things from working.
Fixes#2865.
The code to clear a single achievement was treating dicts as sets.
Additionally, only clearing if the achievement was granted means that the progress is not cleared for half-progress achievements.
This is essentially the same thing as the layer_at_list, except
that it is not cleared when the scene changes, making it suitable
for a set-and-forget 3d stage.
This will ensure that if the Python files were changed for some
reason, they'll be recompiled with the Ren'Py path, and not the
user's.
Fixesrenpy/renpyweb#16.
Passing translated strings to strftime doesn't work on Windows 10
when the locale is set to Korean, but passing the standard codes
does. So we pass the standard codes in, and just include the rest
in the final string.
Fixes#2837.
Rather than propagating TIMEVENT with modal=True through the
entire tree of displayables, this marks the event as modal
when the modal test passes.
This makes it possible for a displayable to know if it has a
modal displayable in front of it.
This is a behavior change, but one that seems correct - we're more
likely to want to translate the prefix and suffix directly, rather
than the previous setup where "Prefix[who]Suffix" was translated.
Compat is included.
Fixes#2817.
This field stores the AST, when no transcludes are supplied.
At https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=62163 ,
and issue was reported that was caused by code looking at the
unanalyzed ast, and not the analyzed AST taken from disk.
This generally would be an autosave on Android, when the interface can't start
propery. Testing and analysis shows that Ren'Py can load these files without
issue.
Fixes#2797.
Visit now updates the DD, but it can leave a raw_child around,
so this clears that out as part of the dupliction, leaving
the state as what it was if visit wasn't called.
Fixes#2788.
It contained a serious translation mistake that had not been corrected for a long time.
ex) directory: game/tl/language -> game/tl/언어 (should not be translated...)
The goal of this is to make sure we're always scaling down, but only
by one mipmap level, so as much information as possible is represented
in the final image, without any being lost by a too-big mipmap.
Per #2764.
In projects where 'dismiss_unfocused' has been provided keys, these keys will also dismiss unfocused hard pauses. Generally this is undesirable, so this commit makes it so hard pauses use an empty list for the dismiss_unfocused parameter of the say behavior.
This moves an image around to where the mouse cursor would be,
making it possible to emulate the mouse cursor using displayables.
(And probably other effects.)
* When a layer transition is occuring, use the old (rather than new)
state for the global transition.
* Allow layer transitions to persist between interactions.
* The scene statement clears layer transitions.
Fixes#2763.
This extends the work done for the uniforms and gl_properties
by making all non-alias properties defined in a single place
in transform.py, and then updating the other data structures
required.
Since we're only copying from the framebuffer, we can use a renderbuffer
rather than a texture as the rendering targer. This should be a more
optimized path.
It was necessary to undo the combining of wait and get, as
this could lead to wait returning None when factor == 0, and
display failing.
However, the last-frame logic makes sense, so re-include it.
Per #2737, it's a bit confusing that excluding /** will exclude
all files in the directory. To fix this, the exclude behavior
is changed to not match a directory that is matched by the pattern
without a trailing * or **.
Fixes#2737.
With these changes, a modal TIMEEVENT is introduced, that is
created when a modal displayable ignores an event. This is
handled differenty, most notibly by not being used for
skipping, while still being used for pause and for
timers.
Ensures that we can sync the audio clip time of new music layer to a channel we specify. This will allow the music layers to remain in sync after save/load (<from X> doesn't sync after save/load).
Usage:
<sync [channel_name]>[audiofilename.ogg]
Otherwise a state of limbo would happen, when you're at or above the max progression level, but you don't have the achievement. Unlocking the achievement then would require to make a progression even higher than previously recorded.
Also there wouldn't be any way to reset progression towards an achievement.
Old-game is a new directory that stores the .rpyc files from the
last release of the game. Unlike in the rest of Ren'Py, the .rpyc
files in old-game can be checked in - they're not intended to be
changed on a regular basis. Ren'Py preferentially uses the .rpyc
files in old-game when assigning names to statements, which means
that even if something prevents the .rpyc files from being
generated, the old-game .rpycs will be used.
These should make looking at log.txt files easier, as the important
information is no longer buried under lists of extensions that
Ren'Py doesn't often use.
While it had been used to switch between GLES and ANGLE on windows,
in the most recent SDL2 ANGLE loads anyway. So there isn't much
use in this module, when used with renpy.exe (rather than in
a development mode).
This let SDL2 create the window again after the GL/GLES settings
have been set. The window creation code is responsible for
selecting the EGL config, and so it's important that it run
in GLES mode.
Fixes#2704.
Now there's the default theme, with generated checkboxes and scrollbar centers but pixel-perfect to the original,
there's the clear theme, same as the default but with generated window and background,
and there's the dark theme, which is the clear theme with tweaked colors.
This fixes a problem on the Galaxy Tab A (2016) where if the
display is not focused at start, the GL surface is created
with the wrong depth (565, or perhaps not at all, rather than
8888), and the window is black until focus is lost and gained
again.
When this happens, the app saves, quits, and is resumed on the
re-launch.
As change are taken into account in an init block (the skin.rpy user customization sure are), there needs to be a full reload.
Luckily, for the launcher it doesn't take much time.
Recreating l_checkbox_box (but as a transform)
Taking into account the image files put by players in the launcher directory
Remains to delete the scrollbars and the checkbox files from the launcher directory
The character replacement isn't scheduled if the character to be replaced has already been binded to a font.
Pending : process target when another FontGroup is given
Pending implementation in the segment method.
The char_map dict maps a character to replace to a character to replace it with.
For example char_map[ord('é')] = ord('e') is a nominal use case.
It's possible to have things like expressions and substutions in
the ParameterizedText strings in lint mode, that use variables
that are not initialized. This check for that and avoids the
errors that occur.
Per #2684.
Specifically:
- Explicitly cast the Unicode characters to FT_ULong before doing bit ops.
- Add the decoded value by 0x10000 to get the actual Unicode value.
- Change the rest of Py_UNICODE castings to FT_ULong so the Unicode values don't get casted back to 16-bit when rendering.
- Make the decode routine easier to read.
Modal has been added to these two displayables, and has been
changed so that it can take a callable that provides more precise
control over what is and isn't modal.
This prevents obscure interactions between the focus system and
the event system in the face of modal screen, where one screen
is modal and the other isn't.
`screen main_menu()` is probably the most customized of all built-in screens.
Currently styles in `screen main_menu` are applied to one `frame` and one `vbox` from `style_prefix`. This way, any time a developer adds a `frame` or a `vbox` to customize their `main_menu` they will inherit some unexpected properties (like `xsize`, `yfill`, `xalign`, `yalign`, a very specific `background`...).
Actually: styles are useful to reuse the same properties in different children of the same type. BUT properties defined in `style main_menu_frame` and `style main_menu_vbox` will hardly be reused.
My proposal (I think it makes more sense) is not to use `style_prefix` in the main menu, but apply directly those two styles to the two unique children that will use them.
This way, if developers add more `vbox` or `frame` to their `main_menu`, they will behave as expected with default properties.
Remove deprecated characteristic flags, per document mentioned in code comment
Add updated checksum to new file. Since the new file is created from manually-packed bits, the original PE object cannot be used for the new checksum. A second object is created for doing this.
This will only be effective when the Python enviroment was built with UCS-2 unicode type (e.g. official Ren'Py binary distribution). Once triggered, it will decode the surrogate pair to an FT_ULong before passing it to the glyph lookup routine in FreeType. Variation sequences are also handled when needed (i.e. <upper surrogate> <lower surrogate> <variation>).
I am of the opinion that when a player is using the keyboard to navigate the interface the location of the mouse should be ignored to avoid potentially confusing the player, but the mousearea displayable doesn't follow this principle. Ideally a mouse area would be able to tell if the keyboard-focused displayable overlaps with it and remain hovered then and only then, so it can be used to style/animate menus of buttons with built in keyboard support, but I have made the mouse area always unhovered when using the keyboard to navigate the interface as a simple solution in the meantime.
This is a lesser form of config.include_i686, the idea being that
the Ren'Py launcher will be whitelisted. (If it works, then we
can remove the Ren'Py icon from the launcher in the next
release.)
SDL2 only seems to check the hint once, at init time. However,
the Enable/Disable functions can be called at any time.
Fixes#2626, hopefully for good this time.
Made it so the focus_extreme function (used when arrow key is pressed if self voicing is off and no displayable on screen is currently focused) ignores displayables with keyboard_focus set to False.
Another attempt at this. It's really only the pause statment not
ending when a modal screen is up that is confusing, so we fix this
by allowing just pauses to avoid modal.
A common cause of display resets seems to be Androuid devices that
lose the egl context when going to sleep. This ensures we make
progress to actually going to sleep when this happens.
This isn't a performance enhancement, anymore, as surfaces aren't
used much any more. It was also causing a memory leak, as the
Texture kept a reference to the Surface, which kept the Surface
alive, which kept the Texture in the cache even if it should have
been purged.
This fixes a jitter problem that happens when the framerate is an
integer multiple of the movie rate. You might skip a frame because
it's a small fraction of a second early, only to have to wait for
the next frame to show it.
These can be performance critical, and involve a render to texture.
This change adds the ability to determine if the new textures have
mipmaps generated.
... which was that dynamic variables wouldn't get reset after a
rollback happened. This wasn't a huge problem, since dynamic
variables mostly were used in contexts, and contexts rarely
cause rollback.
However, we offer rollback as an option when an error in a context
occurs, which could trigger this issue.
Fixes#2599.
First off, it makes sense that if a size is being forced on a
displayable, it should fill to fit that size in possible. So
now xsize, ysize, and xysize force xfill and/or yfill in the
appropriate dimensions.
If box_wrap is true, however, fill is turned off for the last
line. This prevents it from being expanded unnaturally.
Fixes#2589, while preserving the fix for #2081.
This controller doesn't work without some other software to send
the init to it. Trying to use hidapi to initialize the controller
didn't work, and led to problems with other software that uses
USB. (And fundamentally, I don't think Ren'Py should use direct USB
access.)
So, instead, we detect the pro controller and ignore it.
The TimerState object expects to roll back, but there's an edge
case, since usually an object doesn't roll back to the start of
the interaction period when it was first created. However, due
to being reachable through a displayable that doesn't roll back,
the TimerState needs to roll back to its initial state.
Fixes#2596.
- Go back to using SDL_calloc on Windows, as it can be freed properly.
- Go back to 16 byte alignment, now that we patch ffmpeg to handle
alignment properly.
This lets a creator change the amount of time Live2D spends fading,
per the discussion at #2552.
This also changes the motion semantics to be inclusive of the
segment end time, which means the last segment of the motion will
continue forever if not faded out.
This works around the issue fixed by ffmpeg/ffmpeg@ba3e771a42
on sse3 systems, and prepares Ren'Py for other platforms that might want 32-byte alignment.
This may also help crashes (which have never been reported) with movies that have a row
length that is not a multiple of 4 pixels.
This is actually pretty rarely used, basically just for things
like:
label foo(a=1
+ 2):
...
Where an expression is inside parenthesis that exist in Python but
not Ren'Py. This inserts \ before each newline, but with the change
that it doesn't do it when inside a string, where newlines can
be meaningful.
Fixes#2549.
This helps with mipmap construction, as it means that a 1px line on
the edge can blend into transparency as well as other colors.
Fixes#2541, at least when scalling down to > 12.5%.
This will determine if the calling script was compiled in python 2
or python 3 mode, and invoke the python 2 or python 3 open function,
as appropriate.
Intended to address #2543.
Fixes#2539.
What happened is that the object was changed and then became
unreachable. Since purge_unreachable occured in change order,
the object was purged, and was restored in the new, rather than old
version.
This fixes a problem that only occured on AMD GPUs, where buttons
with a focus_mask would not be focused, probably because the
picel was being drawn in the wrong place, at least when anisotropy
is taken into account.
This is because it's possible for very small rounding errors to
cause a computed size to be infitesimally smaller than it should
be, and hence the texture to be a full pixels smaller.
Ren'Py requires that polygons used for clipping meshes or other
polygons all have the same winding order. (Counterclockwise,
in the usual Ren'Py coordinate system.) Certain matrix
multiplications can change winding order, and hence prevent
intersection from working.
This adds a pass that checks and fixes winding orders before
an intersection can occur.
Fixes#2472.
This is the strict handler built into Python, and it's used for
finding errors in Ren'Py script files. (This works around the
patch to Python 2.7 that makes surrogateescape the de-facto
default.)
* Once a rendererer is selected, keep using it even if Ren'Py is restarted.
* Store config.gl2 in persistent._gl2, and restore it if an error happens.
This should work well except for an autreload where config.gl2 is changed,
which ideally shouldn't happen.
Fixes#2457.
This is designed to fix a number of problems caused when running
on a filesystem in which a path is not representable in utf-8.
There are functions, like os.getcwdu that will attempt to decode
these paths, but fail. This ensures that paths can always round-trip
to and from unicode, which should help things work.
* Make CFBundleVersion more readable.
* Add build.mac_info_plist, to provide a more straightforward way
of customizing Info.plist, which lets the about screen be customized.
Fixes#2443.
Sleeping inside Ren'Py or Pygame_SDL2 has been proving to be
problematic. I'm not 100% sure why, though it seems Asyncify is
involved. It may have something to do with the names generated
by cython not being stable, though that's just a guess.
This avoids this problem by preventing Ren'Py from putting
SDL2 into a mode where it can block, and then explicitly
calling emscripten.sleep to emulate the original behavior.
This works around a bug that appears to manifest in the angle2
renderer when running on my radeon on Windows. When that bug
happens:
* GL_NEAREST_MIPMAP_* does not work when ANISOTROPY is non-zero.
* Setting the texture anisotropy to zero doesn't work when it has
been set to non-zero.
Hence, there's a new gl property that, when set, prevents anisotropy
from being added to newly-created textures.
Despite Tkinter being Python's de-facto GUI library, it's often not
installed by default on Linux distributions. PyGObject has very good
support on the other hand, and has the benefit of accessing the native
file picker available on a desktop through Gtk.FileChooserNative. This
commit will have the directory picker attempt to use the Gtk directory
picker first, or else fall back to the tkinter backend.
Some systems don't have libjpeg-turbo8-dev, and need libjpeg62-turbo-dev instead. Use the libjpeg-dev metapackage like https://github.com/renpy/pygame_sdl2/blob/master/README.rst does, which seems to work everywhere. Also, use `$(uname -m)` instead of hardcoding `x86_64` so the same instructions work on ARM systems too.
This fixes#2403, but also opens up some new space for shaders.
Peviously, we'd subsurface the children of a Render with mesh=True,
which would change the coordinates.
Now, the children are not cropped, which allows a shader to look up
value in a second child, if needed.
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.
These need to be declared, but once they are they may be used
in conjunction with a normal expression. This can be used to
model clothing, pose changes, etc in conjunction with a normal
expression.
Fixes#2358.
This fixes a problem with the Haru sample model, where the masks
for her eyes were hidden and at 0 alpha, which mean that the masks
were not rendered, and hence couldn't be used.
Giving mesh True causes a flatten operation, which means that
the outline and top textures of the text become a single layer
before alpha is applied to it. Since alpha is applied once,
the colors are less murky, and we can raise the transparency
without reducing the amount of the background that shows through.
Previously, only the outermost transform would be considered, and
inner transforms would go away. With this change, the child of
the innermost transform is changed, while the outermost transform
is placed in the displayable tree.
This widens the keyboard out some, and will let us use slightly
bigger buttons.
This also adds ., and removes {, }, [, and ], which Ren'Py doesn't
like as part of input.
It hasn't been developed sinced 2013, as far as I can tell, and
the website has been down since 2019. Atom has basically replaced
it.
Editra, thank you for being part of Ren'Py.
Rather than doing weird things with offset, these now work by using
crop to crop the image to its original size. This should make pans
work better with other ATL properties.
Fixes#2320.
LOD is now controlled by u_lod_bias.
There is now a dictionary that is passed around through the gl2
renderer, properties. It's intended as the place to store
information that controls the fixed-function portions of
the GL pipeline. Right now, it controls the texture_scaling
mode (used to implement nearest neighbor rendering), and
pixel_perfect rendering, but it can be used for other things
in the future.
The full set of texture_scaling modes are now available.
It could trigger in a case where a C function in the module had the
same name as the module itself. (Like the render function in
renpy.display.render.) This causes functions that import it to
report an error.
The drawable align shader has a number of problems, most notably
that it could be triggered by accident - for example, the corners
of a Frame would trigger it. It could also move the diferent corners
of a texture differently, which would lead to blurring.
This replaces it with the concept of pixel perfect rendering. A
Render can be rendered in a pixel perfect manner if the only
transforms it has undergone are shifts by an integer number of
pixels. After a Render opts in (right now, Text is the only Render
that does so), each Model that it draws is shifted until (0, 0) is
located on an integer pixel on the screen.
Compared to drawable_align, pixel perfect rendering is simpler - by
actually transforming a point, it's easy to determine the nearest
pixel, and then move the draw by up to 1/2 of a pixel in each
axis.
After compared with the below code table, added some lacked characters.
GB 2312-80 (China)
Big 5 (Taiwan) + frequency table
JIS X 0208 (Japan) + joyo kanji
This replaces the flatten property, and explicitly flattens into
a mesh, if possible. Optionally, this takes a tuple, that
defines the number of points in the horizontal and vertical
directions that make up the mesh. (The idea being that a
vertex shader can then distort the mesh.)
The different shader variables now get prefixed with the GLSL
type - u_ for uniform, a_ for attribute, v_ for varying. This
makes sure that we're good if OpenGL adds new functions.
There are two new uniforms - u_time is the frame time, and u_random
is a vec4 with 4 random values in it.
Uniforms beginning with u_renpy and the standard uniforms (u_transform,
u_time, and u_random) are not exposed to ATL. (Since Ren'Py would just
overwrite them, anyway.)
Instead of special-casing these uniforms, they're updated by the
displayables that change them, and then config.merge_uniforms
makes sure that things like nested color matrixes and nested
alpha combine properly.
This is a dictionary that explains how to merge together uniforms
that are provided by the same shader in multiple places. For example,
the alpha should me multiplied, not replaced.
ColorMatrix is the new base class for objects that can be called
to return a Matrix. ATL can interpolate between different instances
of the same ColorMatrix subclass, and ColorMatrixes can be multiplied
together, in which case the relevant Matrixes wil be multipled
together.
Thinking about Patreon + #2255, I've realized that reusing im.matrix
is probably a bad idea. The 5x5 matrices don't make sense with
premultiplied alpha, and ATL really wants function-like objects
that help animated things.
In the redesign, matrixcolor takes either a 4x4 Matrix, or a
function-like object (a ColorMatrix object) that takes an old
object to interpolate from, a completion amount, and returns
a Matrix.
These were mostly used by the software renderer, which is no longer
performance-critical. The MMX-based stuff appears to be broken on
i686 on recent GCCs (it had been disabled on Linux for years), so
it's easy to justify removing it.
Changes all instances of `<dict>.has_key(<key>)` to `<key> in <dict>` across all Python and RenPy files, as Python 3 has removed the `has_key` method.
Excuse my grammar and missing backtick quoted content in my last commit... how embarassing.
The last commit was supposed to say: "Changed all instances of `except <type>, <var>` to `except <type> as <var>`"...
Setting size to None is used reset and few other places so we need to
keep support for clearing size in that way rather than requiring code to
be ported to explicitly setting xsize and ysize to None.
If maxsize is specified, minsize is ignored.
If not None, minsize causes the displayable to be scaled so that it fills a box of this size, while preserving aspect ratio. (Note that this means that one of the dimensions may be greater than the size of this box.)
Since there's no direct linking to OpenGL anymore, there's no reason
to delay this import, and doing so makes the Live2D API available
in the standard manner.
Generally, the resource segment Ren'Py uses will be bigger than the
one used in games. If it is, keep it. Otherwise, use the delta
between section sizes everywhere.
This provides a way to profile init blocks.
It's probably best used with something like:
init -1000 python:
config.profile_init = .2
To display any init block that takes longer than .2 seconds.
Changes to Apple's notatization system make it hard to include
unsigned executables. To fix this, we'll attempt to write the
executables after the launcher starts.
Such messages arise with
label start:
pause # eval failed here
$var = None
pause # non-existing label None here
$var = "test"
pause
call expression var
jump expression var
In addition, minor refactoring and error description change in parse_play_music to be more consistent with parse_queue_music and the new parse_stop_music
Introduce new 'voice' type in progressive_download.txt.
Predict 'voice' statements and pre-downloads them; removes files after 3mn to avoid consuming all memory.
Currently auto-voicing is not supported (may need prediction in "say" statement).
* Allow the player to select the model-based renderers.
* Remove the framerate test. (This was after seeing a Surface that
reported the error, but was working fine. Plus, it's not clear
that DX would have helped.)
* Remove the DirectX installer.
As Ren'Py become more dependent on GL for functionality and
performance, the purpose of the software renderer is to provide
error messages to players.
As a result, support for fullscreen mode and a custom mouse has
been removed.
This is a much better fit for modern computers, as it means that Ren'Py
can use the window that has been resized for it, rather than having to
restart the video system whenever a resize occurs.
The update to the newest SDL on Androd seems to call terminate,
even when the app might come back to life. It's okay to let the
OS kill us, so we do that.
It took me forever to spot that there are 2 functions with the same name, and the first one in the documentation (which we find through Ctrl+F) did not mention that.
This had mostly been true, but there were a few places where
if the android module had been importable was what mattered.
This has been fixed by moving to a unified Python library.
Very basic (static elasticity) Catmull-Rom implementation to work with knots in ATL. Slight tweak to allow a knot to be a tuple of tuples and minor documentation changes.
This is the start of integrating the renpy-build results into the
Ren'Py build process. As part of this, renpy.sh has been moved into
renpy-build, and is copied here as the dependences are built.
Per #2079.
The idea here is that music may often not be mixed with the
thought of self voicing in mind, and so it makes sense to drop
the music and sound mixers when self-voicing is enabled. The
amount to drop by is controllable from the accessibility menu,
for games where this is not desired.
This removes a the image manipulators that depend on a file from the
image cache when one of the files that are depended on change. This
is also a first draft of the function needed to load files from the
web on the fly.
Apart from being faster in some circumstances, this is close to
what other platforms (ie, Live2D) use internally, so at some point
we can avoid copying over that data.
This removes a the image manipulators that depend on a file from the
image cache when one of the files that are depended on change. This
is also a first draft of the function needed to load files from the
web on the fly.
There was a problem reported whenre Py_DECREF could cause arbitrary
pauses to occur. Now, the names stored inside renpysound are C strings,
rather than Python strings, and so they can be deallocated without
risk of triggering the garbage collector.
Locking has also been somewhat simplified - theree are now two
locks, the audio and name lock, with rules of each. The functions
now do not grab the GIL automatically, as there's no need.
This is part of the ongoing modernization program. OpenGL 1.x is
now hopelessly obsolete, so it's gone. SDL2 now supports creating
contexts for us, so we'll use it to manage the EGL path.
- Use \n separator in renpyweb_remote_files.txt
- Move download code to a new module
- load_core() now throws a DownloadNeeded exception which is caught by Image.load(), calling renpy.webloader.enqueue()
- renpyweb_remote_files.txt is now only processed if downloading is enabled
This compiles python in a .rpy file in a way that is more compatible
with Python 3. (It enables Python 3 division, and will enable Python3
.items(), .keys(), and .values().)
Cython implements .iteritems, .itervalues, and .iterkeys for dicts
in a way that works with Python 3 - so long as it knows that it's
dealing with a dict type. This add some annotations to help it out.
This is the start of a series of changes that will embrace future's
philosophy - that Python 2/3 source should be as close to Python 3
as possible - and even extended a bit, like with dictviews.
We do have to pick and choose with future - it's important that
Ren'Py remain performant over the transition period - but things
like using sys.modules to map modules to their new Python 3
locations does appeal to me.
It now triggers on: from __future__ import with_statement, division.
This should be a bit safer, because with_statement is obsolete - even if
it is used by any Python, it can be removed without changing the
semantics of the program. (We can't trigger _just_ on it, as all
old .rpycs are compiled with that flag.)
Right now, this is opted into when "from __future__ import division"
is given, and lets us program using Python 3's dict semantics while
still working in Python 2.
Probably the only way py3 Ren'Py is going to look acceptable is
to support .items(), and the only way to do that is to patch Python
2.7 to replace the method with one that returns the appropriate
proxy.
While we're at it, we can re-add iteritems() and itervalues(),
makng those accessible to older code via dict.
This is intended for use as the clip polygon, and hence it doesn't
need 3d support. (The new Mesh implermentation doesn't use this,
as it has its own polygons.)
This is part of a series of performance improvements when threaded
optimizations are enabled on Nvidia cards. (__GL_THREADED_OPTIMIZATIONS=1
on Linux.)
glGenTextures was taking a long time - 3ms! - to complete. So we
avoid it entirely, and instead allocate the texture numbers
beforehand and clear the textures without deallocating the
numbers.
This particular use case appears to be safe, but I could make Ren'Py crash with more complex async_call-s.
This may also explain some irregular crashes a while ago when letting RenPyWeb run unattended.
This is somewhat similar to running Python in two threads. In doubt, let's avoid.
Moreover, however autosave is run, the browser will freeze a bit, no significant change.
This is possible for certain things like viewports that share an
adjustement, or bars that are rendered before the corresponding
viewport. This detects this case are restores the render to a
useable state.
Turns out that a .zip can't really represent the extended
attributes used for signing some files properly, but the
tar format can. So we use that to ship things over, and
get a working .dmg.
This should fix a race condition where that could cause unprefixed
key commands (like 'v' or 'a') to trigger if KEYDOWN is present
but the TEXTINPUT hasn't been delivered yet.
This is a backport of a performance improvement from the gl2
branch, where profiling reported that rebinding the framebuffer
was very slow, and simply copying the pixels out is much
faster.
Additional stores are available as local variables in the default 'store' under their name already, consequently 'import store.mystore as mystore' is a no-op
While we could have just added it to the tuple of shaders created in
GL2DrawingContext, that would lead to creating a tuple on every
render. So instead, it's added in the shader compiler.
* Ask GL for the maximum size.
* Remove the idea of generations - we swap out the loader when a
generation is obsolete.
* Cache the fbo so changing it is needed less often.
This improves gl2 Polygons and Meshes by making it clear if a
new object is created or they're updated in place, by supporting
multiplication by matrices directly, and by including the repr
function everywhere.
Really, a quality of life improvement.
After extensive profiling my GTX 1060, it appears that using
glFrameBufferTexture2D is unacceptably slow. (300+us for just that
one call). glCopyTexImage seem to be much faster, with realistic
small texture loads (like button images) taking 60us or so.
Add support for tile="integer" to frame.
This is a version of tiling that always does an integer number of repeats, scaling as necessary to accomplish this.
This might actually change over the lifecycle of a polygon, as the
winding of the polygon changes when it goes from the pygame/Ren'Py
coordinate space to the OpenGL viewport space.
This change means it doesn't matter - polygon intersection can
always occur.
The differentiation between .deinit() and .quit() was hard to understand.
This change makes it clear - .kill_textures frees all of the OpenGL textures,
while .quit() releases all GL resources.
This is a much simpler fix for the problem in a1dd218560,
which is that the wrong scope will be given in a used screen that happens to be
constant.
The realization is that if a used screen is constant, it can't change - and hence
it doesn't need to be given a new scope at all.
Fixes#1905, where several bugs got collected into one place. The
main problem is that we need to store the actual values of
non-constant variables that, for example, change durting iteration,
while at the same time allowing things that use the scope to
update when the screen scope changes (from new parameters, or
something like SetScreenVairable).
This uses a method (scope_changed, similar to copy_on_change) to
take things that use the scope out of the cache when a scope change
happens.
- Move it to 00acessibility.rpy, where I can find it.
- sv -> alt (The old name still works.)
- Allow the creator to supply a character that's used to display
descriptive text.
The check hadn't included that, which means that text tags would
not be processed when self_closing_custom_text_tags was set, and
custom_text_tags was not.
A field (especially a global Variable) might not exists at the beginning of the interaction. This causes the application to crash e.g. if the variable is set on the 'action' of a button.
The solution is that the get_selected returns False if the given field does not exists at the moment.
# Copyright 2004-2019 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -19,37 +19,49 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
default persistent.android_bundle = False
init python:
ANDROID_NO_RAPT = 0
ANDROID_NO_JDK = 1
ANDROID_NO_SDK = 2
ANDROID_NO_KEY = 3
ANDROID_NO_CONFIG = 4
ANDROID_OK = 5
ANDROID_NO_BUNDLE_KEY = 4
ANDROID_NO_CONFIG = 5
ANDROID_NO_BUNDLE = 6
ANDROID_OK = 7
JDK_REQUIREMENT=8
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=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher.")
NO_JDK_TEXT = _("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.")
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_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.")
LOGCAT_TEXT = _("Retrieves the log from the Android device and writes it to a file.")
LIST_DEVICES_TEXT = _("Lists the connected devices.")
PAIR_TEXT = _("Pairs with a device over Wi-Fi, on Android 11+.")
CONNECT_TEXT = _("Connects to a device over Wi-Fi, on Android 11+.")
DISCONNECT_TEXT = _("Disconnects a device connected over Wi-Fi.")
DEBUG_TEXT = _("Selects the Debug build, which can be accessed through Android Studio. Changing between debug and release builds requires an uninstall from your device.")
RELEASE_TEXT = _("Selects the Release build, which can be uploaded to stores. Changing between debug and release builds requires an uninstall from your device.")
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
@@ -82,6 +94,7 @@ init python:
import rapt.install_sdk
import rapt.plat
import rapt.interface
import rapt.keys
rapt.plat.renpy = True
rapt.plat.translate = __
@@ -100,10 +113,16 @@ init python:
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(os.path.join(project.current.path, ".android.json")):
__("Run configure before attempting to build the app.")
__("Google Play support is enabled, but build.google_play_key is not defined.")
__("Updating project.")
__("Creating assets directory.")
__("Creating expansion file.")
__("Packaging internal data.")
__("I'm using Gradle to build the package.")
__("Uploading expansion file.")
__("The build seems to have failed.")
__("I'm installing the bundle.")
__("Installing the bundle appears to have failed.")
__("Launching app.")
__("Launching the app appears to have failed.")
__("The build seems to have succeeded.")
__("The arm64-v8a version works on newer Android devices, the armeabi-v7a version works on older devices, and the x86_64 version works on the simulator and chromebooks.")
__("What is the full name of your application? This name will appear in the list of installed applications.")
__("What is the short name of your application? This name will be used in the launcher, and for application shortcuts.")
__("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.")
@@ -29,8 +29,8 @@ init python hide:
__("{} 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.")
__("What is the version code?\n\nThis must be a positive integer number, and the value should increase between versions.")
__("The numeric version 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.")
@@ -40,17 +40,13 @@ init python hide:
__("Amazon App Store.")
__("Both, in one app.")
__("Neither.")
__("Would you like to create an expansion APK?")
__("No. Size limit of 100 MB on Google Play, but can be distributed through other stores and sideloaded.")
__("Yes. 2 GB size limit, but won't work outside of Google Play. (Read the documentation to get this to work.)")
__("Do you want to allow the app to access the Internet?")
__("Do you want to automatically update the generated project?")
__("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\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\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\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\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/?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.")
__("The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nYou can also set the JAVA_HOME environment variable to use a different version of Java.")
__("The JDK is present and working. Good!")
__("The Android SDK has already been unpacked.")
__("Do you accept the Android SDK Terms and Conditions?")
@@ -59,13 +55,20 @@ init python hide:
__("I've finished unpacking the Android SDK.")
__("I'm about to download and install the required Android packages. This might take a while.")
__("I was unable to accept the Android licenses.")
__("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.")
__("You set the keystore yourself, so I'll assume it's how you want it.")
__("You've already created an Android keystore, so I won't create a new one for you.")
__("I can create an application signing key for you. Signing an application with this key allows it to be placed in the Android Market and other app stores.\n\nDo you want to create a key?")
__("I will create the key in the android.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\n\You 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?")
__("It looks like you're ready to start packaging games.")
__("Please enter your name or the name of your organization.")
__("I found an android.keystore file in the rapt directory. Do you want to use this file?")
__("I can create an application signing key for you. This key is required to create Universal APK for sideloading and stores other than Google Play.\n\nDo you want to create a key?")
__("I will create the key in the android.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of android.keystore, and keep it in a safe place?")
__("\n\nSaying 'No' will prevent key creation.")
__("Could not create android.keystore. Is keytool in your path?")
__("I've finished creating android.keystore. Please back it up, and keep it in a safe place.")
__("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 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?")
__("\n\nSaying 'No' will prevent key creation.")
__("Could not create bundle.keystore. Is keytool in your path?")
__("I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place.")
# Some analysis and the little I could find on how the symbol tables were layed out show that the PE table is in two sections. One is
# a list of NumberOfSymbols*(18 bytes) symbol entries, followed immediately by a string table who's length is specified in the 4 bytes following the symbol structure list
#Again, the information *seems* to indicate that this will always follow the entire block of all sections (so be at the end of the file)
######
# As a related note, apparently this flag has been deprecated, but appears to be set (I think ..) in the renpy.exe that is used to build from..
# no idea of a consequence, just an observation
# https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics , see "IMAGE_FILE_LINE_NUMS_STRIPPED" :
# COFF line numbers have been removed. This flag is deprecated and should be zero.
# In renpy.exe, this 2-byte flag is @ 0x096 and 0x097 in little-endian
# Section, SizeOfRawData = multiple of FileAlignment (On Disk size)
# Scetion, VirtualSize is NOT aligned to any specific number, and rwdata may be > than this due to its alignment requirement (In memory size)
#
# the resource section should be padded out to meet the alignment requirement of SizeOfRawData = multiple of FileAlignment (So, in the file, since on disk)
#
#####
# RVA table virt address and size = that in the section header
#
#####
# SizeOfImage must be aligned to SectionAlignment (memory alignment)
# There is NO padding needed, the image size number simply needs to be aligned to >= the
interface.error(_("Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-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 python-tk or tkinter package."), label=None)
# Add Python (with the same name as our executables)
self.add_python()
@@ -538,16 +636,35 @@ init python in distribute:
# Assign the x-bit as necessary.
self.mark_executable()
# Merge file lists, as needed.
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"],
@@ -577,7 +694,7 @@ 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."))
# Copyright 2004-2019 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -67,8 +67,8 @@ init 1 python in editor:
ei = EditorInfo(filename)
if ei.name in editors:
if editors[ei.name].mtime >= ei.mtime:
return
if editors[ei.name].mtime >= ei.mtime:
return
editors[ei.name] = ei
@@ -148,72 +148,79 @@ init 1 python in editor:
fei = fancy_editors = [ ]
# Atom.
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.
if os.path.exists(os.path.join(config.renpy_base, "jedit")):
fei.append(FancyEditorInfo(
2,
_("jEdit"),
_("A mature editor that requires Java."),
"jedit",
_("1.8 MB download required."),
_("This may have occured because Java is not installed on this system."),
))
# jEdit
fei.append(FancyEditorInfo(
2,
"jEdit",
_("A mature editor that requires Java."),
"jedit",
_("1.8 MB download required."),
_("This may have occured because Java is not installed on this system."),
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(
@@ -222,8 +229,11 @@ init 1 python in editor:
_("Invokes the editor your operating system has associated with .rpy files."),
None))
for k in editors:
if k in [ "Atom", "Editra", "jEdit", "System Editor", "None" ]:
if k in [ "Visual Studio Code", "Visual Studio Code (System)", "Atom", "jEdit", "System Editor", "None" ]:
continue
fei.append(FancyEditorInfo(
@@ -243,7 +253,8 @@ init 1 python in editor:
# If we're in a linux distro or something, assume all editors work.
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 occured 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 occured while launching the text editor:\n[exception!q]"), error_message, exception=exception)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
SIL OPEN FONT LICENSE
Version 1.1 - 26 February 2007
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects,
to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework
in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold
by themselves.
The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided
that any reserved names are not used by derivative works.
The fonts and derivatives, however, cannot be released under any other type of license.
The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such.
This may include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting, or substituting ? in part or in whole ?
any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge,
embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,in Original or Modified Versions,
may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software,
provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files,
human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields
can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written
permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented
to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise
any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit
written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed
under any other license. The requirement for fonts to remain under this license does not apply to any document created using
the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT.
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE
_("{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?"),
__("{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?") +
__("{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}"),
[
("change", _("Choose new colors, then regenerate image files.")),
("regenerate", _("Regenerate the image files using the colors in gui.rpy.")),
@@ -336,15 +328,18 @@ label gui_project_size:
python:
default_size = (1920, 1080)
gui_size = interface.choice(
_("What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 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"),
)
@@ -361,7 +356,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
@@ -377,7 +372,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)
jump front_page
screen install_preferences():
frame:
style "l_indent"
has vbox
text _("This screen allows you to install libraries that can't be distributed with Ren'Py. Some of these libraries may require you to agree to a third-party license before being used or distributed.")
add SPACER
if not achievement.has_steam:
textbutton _("Install Steam Support"):
action Jump("install_steam")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}.")
else:
textbutton _("Install Steam Support")
add HALF_SPACER
frame:
style "l_indent"
has vbox
text _("Steam support has already been installed.")
add SPACER
textbutton _("Install Live2D Cubism SDK for Native"):
action Jump("prompt_live2d")
screen install_live2d():
frame:
style_group "l"
style "l_root"
window:
has vbox
label _("Install Libraries")
add HALF_SPACER
hbox:
frame:
style "l_indent"
xfill True
viewport:
scrollbars "vertical"
mousewheel True
has vbox
add SPACER
textbutton _("Install Live2D Cubism SDK for Native"):
action Jump("install_live2d")
add HALF_SPACER
frame:
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.")
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.")
# Copyright 2004-2019 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2023 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
@@ -41,7 +41,7 @@ init python:
try:
if (language is None) or os.path.exists(os.path.join(config.renpy_base, "templates", language)):
legacy = True
except:
except Exception:
pass
if new and legacy:
@@ -74,11 +74,11 @@ label new_project:
cancel=Jump("front_page"),
)
else:
new_project_language = (_preferences.language or "english").title()
new_project_language = __("{#language name and font}")
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."))
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"))
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 بكسل."
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."
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."
@@ -102,8 +102,8 @@ translate finnish strings:
new "Kalibroidaan [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Paina tai liikuta [control!r] [kind]."
old "Press or move the [control!s] [kind]."
new "Paina tai liikuta [control!s] [kind]."
# 00gamepad.rpy:66
old "Skip (A)"
@@ -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"
new "Hiiren Rulla Ylös\nKlikkaa Palautussivua"
# 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."
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 "Les options de ce menu ont pour objectif d'augmenter l'accessibilité. Elles peuvent ne pas fonctionner sur tous les jeux, et certaines combinations d'options peuvent rendre le jeu injouable. Le problème ne vient pas du jeu ou du moteur. Pour de meilleurs résultats en changeant la police, essayez de maintenir le texte de la même taille qu'avant."
# renpy/common/00action_file.rpy:353
old "Save slot %s: [text]"
new "Sauvegarder %s : [text]"
# renpy/common/00action_file.rpy:434
old "Load slot %s: [text]"
new "Charger %s : [text]"
# renpy/common/00action_file.rpy:487
old "Delete slot [text]"
new "Supprimer slot [text]"
# renpy/common/00action_file.rpy:566
old "File page auto"
new "Page auto"
# renpy/common/00action_file.rpy:568
old "File page quick"
new "Page rapide"
# renpy/common/00action_file.rpy:570
old "File page [text]"
new "Page [text]"
# renpy/common/00action_file.rpy:769
old "Next file page."
new "Page suivante."
# renpy/common/00action_file.rpy:841
old "Previous file page."
new "Page précédente."
# renpy/common/00action_file.rpy:920
old "Quick save."
new "Sauvegarde rapide."
# renpy/common/00action_file.rpy:939
old "Quick load."
new "Chargement rapide."
# renpy/common/00action_other.rpy:375
old "Language [text]"
new "Langue [text]"
# renpy/common/00director.rpy:708
old "The interactive director is not enabled here."
new "Le réalisateur interactif n'est pas activé ici."
# renpy/common/00director.rpy:1481
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1487
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1551
old "Done"
new "Fait"
# renpy/common/00director.rpy:1561
old "(statement)"
new "(instruction)"
# renpy/common/00director.rpy:1562
old "(tag)"
new "(tag)"
# renpy/common/00director.rpy:1563
old "(attributes)"
new "(attributs)"
# renpy/common/00director.rpy:1564
old "(transform)"
new "(transform)"
# renpy/common/00director.rpy:1589
old "(transition)"
new "(transition)"
# renpy/common/00director.rpy:1601
old "(channel)"
# Automatic translation.
new "(canal)"
# renpy/common/00director.rpy:1602
old "(filename)"
new "(fichier)"
# renpy/common/00director.rpy:1631
old "Change"
new "Changer"
# renpy/common/00director.rpy:1633
old "Add"
new "Ajouter"
# renpy/common/00director.rpy:1639
old "Remove"
new "Retirer"
# renpy/common/00director.rpy:1674
old "Statement:"
new "Instruction :"
# renpy/common/00director.rpy:1695
old "Tag:"
new "Tag :"
# renpy/common/00director.rpy:1711
old "Attributes:"
new "Attributs :"
# renpy/common/00director.rpy:1729
old "Transforms:"
new "Transforms :"
# renpy/common/00director.rpy:1748
old "Behind:"
new "Derrière :"
# renpy/common/00director.rpy:1767
old "Transition:"
new "Transition :"
# renpy/common/00director.rpy:1785
old "Channel:"
new "Piste :"
# renpy/common/00director.rpy:1803
old "Audio Filename:"
new "Fichier audio :"
# renpy/common/00keymap.rpy:300
old "Failed to save screenshot as %s."
new "Échec de sauvegarde de la capture d'écran %s."
# renpy/common/00preferences.rpy:240
old "display"
new "affichage"
# renpy/common/00preferences.rpy:252
old "transitions"
new "transitions"
# renpy/common/00preferences.rpy:261
old "skip transitions"
new "passer les transitions"
# renpy/common/00preferences.rpy:263
old "video sprites"
new "sprites vidéo"
# renpy/common/00preferences.rpy:272
old "show empty window"
new "afficher fenêtre vide"
# renpy/common/00preferences.rpy:281
old "text speed"
new "vitesse du texte"
# renpy/common/00preferences.rpy:289
old "joystick"
new "joystick"
# renpy/common/00preferences.rpy:289
old "joystick..."
new "joystick..."
# renpy/common/00preferences.rpy:296
old "skip"
new "passer"
# renpy/common/00preferences.rpy:299
old "skip unseen [text]"
new "passer [text] non lus"
# renpy/common/00preferences.rpy:304
old "skip unseen text"
new "passer le texte non lu"
# renpy/common/00preferences.rpy:306
old "begin skipping"
new "commencer à passer"
# renpy/common/00preferences.rpy:310
old "after choices"
new "après les choix"
# renpy/common/00preferences.rpy:317
old "skip after choices"
new "passer après les choix"
# renpy/common/00preferences.rpy:319
old "auto-forward time"
new "avancée du temps automatique"
# renpy/common/00preferences.rpy:333
old "auto-forward"
new "avancée automatique"
# renpy/common/00preferences.rpy:340
old "Auto forward"
new "Avancée automatique"
# renpy/common/00preferences.rpy:343
old "auto-forward after click"
new "avancée automatique après un clic"
# renpy/common/00preferences.rpy:352
old "automatic move"
new "mouvement automatique"
# renpy/common/00preferences.rpy:361
old "wait for voice"
new "attendre la voix"
# renpy/common/00preferences.rpy:370
old "voice sustain"
new "maintien de la voix"
# renpy/common/00preferences.rpy:379
old "self voicing"
new "lecture vocale"
# renpy/common/00preferences.rpy:388
old "self voicing volume drop"
new "baisse de volume pendant la lecture vocale"
# renpy/common/00preferences.rpy:396
old "clipboard voicing"
new "voix par presse-papier"
# renpy/common/00preferences.rpy:405
old "debug voicing"
new "voix de debug"
# renpy/common/00preferences.rpy:414
old "emphasize audio"
new "mise en valeur de l'audio"
# renpy/common/00preferences.rpy:423
old "rollback side"
new "côté de rollback"
# renpy/common/00preferences.rpy:433
old "gl powersave"
new "gl économie d'énergie"
# renpy/common/00preferences.rpy:439
old "gl framerate"
new "gl images par seconde"
# renpy/common/00preferences.rpy:442
old "gl tearing"
new "gl tearing"
# renpy/common/00preferences.rpy:445
old "font transform"
new "apparence de la police"
# renpy/common/00preferences.rpy:448
old "font size"
new "taille de police"
# renpy/common/00preferences.rpy:456
old "font line spacing"
new "taille d'espaces"
# renpy/common/00preferences.rpy:464
old "system cursor"
new "curseur système"
# renpy/common/00preferences.rpy:484
old "music volume"
new "volume de la musique"
# renpy/common/00preferences.rpy:485
old "sound volume"
new "volume du son"
# renpy/common/00preferences.rpy:486
old "voice volume"
new "volume des voix"
# renpy/common/00preferences.rpy:487
old "mute music"
new "couper la musique"
# renpy/common/00preferences.rpy:488
old "mute sound"
new "couper le son"
# renpy/common/00preferences.rpy:489
old "mute voice"
new "couper les voix"
# renpy/common/00preferences.rpy:490
old "mute all"
new "couper tout"
# renpy/common/_developer/developer.rpym:43
old "Interactive Director (D)"
new "Réalisateur interactif (D)"
# renpy/common/_developer/developer.rpym:57
old "Show Image Load Log (F4)"
new "Montrer le log ne chargement des images (F4)"
# renpy/common/_developer/developer.rpym:60
old "Hide Image Load Log (F4)"
new "Masquer le log de chargement des images (F4)"
# renpy/common/_developer/developer.rpym:63
old "Image Attributes"
new "Attributs d'image"
# renpy/common/_developer/developer.rpym:90
old "[name] [attributes] (hidden)"
new "[name] [attributes] (masqué)"
# renpy/common/_developer/developer.rpym:94
old "[name] [attributes]"
new "[name] [attributes]"
# renpy/common/_developer/developer.rpym:154
old "Hide deleted"
new "Masquer les supprimés"
# renpy/common/_developer/developer.rpym:154
old "Show deleted"
new "Montrer les supprimés"
# renpy/common/_developer/developer.rpym:506
old "Type to filter: "
new "Écrire pour filtrer : "
# renpy/common/_developer/developer.rpym:631
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Textures : [tex_count] ([tex_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:635
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Cache d'images : [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# renpy/common/00preferences.rpy:480
old "renderer menu"
new "menu de rendu"
# renpy/common/00preferences.rpy:483
old "accessibility menu"
new "menu d'accessibilité"
# renpy/common/00accessibility.rpy:180
old "High Contrast Text"
new "Texte en contraste élevé (surbrillance)"
# 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"
@@ -99,11 +102,11 @@ translate french strings:
# _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)"
@@ -115,7 +118,7 @@ translate french strings:
# 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."
@@ -125,55 +128,86 @@ translate french strings:
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"
new "commandes:\n"
new "commandes:\n"
# 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"
new "exit: quitter la console"
new "exit: quitter la console"
# 00console.rpy:435
old "load <slot>: loads the game from slot"
new "load <slot>: charger la partie de cet emplacement"
new "load <slot>: charger la partie de cet emplacement"
# 00console.rpy:448
old "save <slot>: saves the game in slot"
new "save <slot>: sauvegarder la partie dans cet emplacement "
new "save <slot>: sauvegarder la partie dans cet emplacement "
# 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"
new "watch <expression>: surveiller une expression Python"
new "watch <expression>: surveiller une expression Python"
# 00console.rpy:493
old "unwatch <expression>: stop watching an expression"
new "unwatch <expression>: Arrêter la surveillance d’une expression Python"
new "unwatch <expression>: arrêter la surveillance d’une expression Python"
# 00console.rpy:519
old "unwatchall: stop watching all expressions"
new "unwatchall: Arrêter de surveiller toutes les expressions"
new "unwatchall: arrêter de surveiller toutes les expressions"
# 00console.rpy:536
old "jump <label>: jumps to label"
new "jump <label>: Saute jusqu’au label"
new "jump <label>: saute jusqu’au label"
# 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"
# renpy/common/00console.rpy:917
old "short: Shorten the representation of objects on the console (default)."
new "short : Raccourcit la représentation des objets sur la console (par défaut)."
# renpy/common/00console.rpy:921
old "long: Print the full representation of objects on the console."
new "long : Affiche la representation entière des objets dans la console."
# renpy/common/00console.rpy:925
old "escape: Enables escaping of unicode symbols in unicode strings."
new "escape : Active l'échappage des symboles unicode dans les chaînes de caractères unicode."
# 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."
@@ -102,8 +101,8 @@ translate french strings:
new "Calibrage de [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Pressez ou déplacez le [kind] [control!r]."
old "Press or move the [control!s] [kind]."
new "Pressez ou déplacez le [kind] [control!s]."
# 00gamepad.rpy:66
old "Skip (A)"
@@ -177,8 +176,6 @@ translate french strings:
old "Copies the errors.txt file to the clipboard."
new "Copie le contenu du fichier « errors.txt » dans le presse-papier."
translate french strings:
# renpy/common/_errorhandling.rpym:542
old "Copy BBCode"
new "Copier en BBCode"
@@ -215,3 +212,82 @@ translate french strings:
old "Copies the errors.txt file to the clipboard as Markdown for Discord."
new "Copie le fichier errors.txt dans le presse-papier au format Markdown pour Discord."
# renpy/common/00gltest.rpy:89
old "Renderer"
new "Moteur de rendu"
# renpy/common/00gltest.rpy:100
old "Force GL Renderer"
new "Forcer le moteur de rendu GL"
# renpy/common/00gltest.rpy:105
old "Force ANGLE Renderer"
new "Forcer le moteur de rendu ANGLE"
# renpy/common/00gltest.rpy:110
old "Force GLES Renderer"
new "Forcer le moteur de rendu GLES"
# renpy/common/00gltest.rpy:116
old "Force GL2 Renderer"
new "Forcer le moteur de rendu GL2"
# renpy/common/00gltest.rpy:121
old "Force ANGLE2 Renderer"
new "Forcer le moteur de rendu ANGLE2"
# renpy/common/00gltest.rpy:126
old "Force GLES2 Renderer"
new "Forcer le moteur de rendu GLES2"
# renpy/common/00gltest.rpy:136
old "Enable (No Blocklist)"
new "Activer (Sans Blocklist)"
# renpy/common/00gltest.rpy:159
old "Powersave"
new "Économie d'énergie"
# renpy/common/00gltest.rpy:173
old "Framerate"
new "Images par seconde"
# renpy/common/00gltest.rpy:177
old "Screen"
new "Écran"
# 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."
new "Ce jeu nécessite l'usage de GL2, qui ne peut pas être initialisé."
# renpy/common/00gltest.rpy:259
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
new "Le fichier {a=edit:1:log.txt}log.txt{/a} peut contenir des informations pour vous aider à déterminer ce qui ne va pas avec votre ordinateur."
# renpy/common/00gltest.rpy:264
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
new "Plus de détails sur comment réparer ça dans la {a=[url]}documentation{/a}."
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
new "## L'instruction init offset fait exécuter les instructions d'initialisation de ce fichier tavant les instructions init des autres fichiers."
# gui/game/gui.rpy:17
old "## GUI Configuration Variables"
new "## Variables de Configuration du GUI"
# gui/game/gui.rpy:165
old "## The color of button text in various states."
new "## La couleur du texte des boutons dans différents états."
# gui/game/gui.rpy:171
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
new "## L'alignement horizontal du texte des boutons. (0.0 est à gauche, 0.5 est au centre, 1.0 est à droite)."
# gui/game/gui.rpy:276
old "## The position of the main menu text."
new "## La position du texte du menu principal."
# gui/game/gui.rpy:285
old "## Generic frames."
new "## Frames génériques."
# gui/game/gui.rpy:305
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
new "## Le GUI par défaut utilise uniquement des sliders et des barres de scrolling verticales. Toutes les autres barres ne sont utilisées que dans des screens écrits par l'utilisateur."
# gui/game/gui.rpy:366
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 "## Le nombre maximum d'entrées en mode NVL que Ren'Py affichera. Quand plus d'entrées sont affichées, les plus anciennes seront retirées."
# gui/game/gui.rpy:402
old "## Localization"
new "## Localisation (traduction et adaptation aux langues et cultures)"
# gui/game/gui.rpy:404
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 "## Ceci contrôle où un saut de ligne est autorisé. La valeur par défaut convient à la plupart des langues. Une liste des valeurs disponible peut être trouvée sur https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# gui/game/gui.rpy:412
old "## Mobile devices"
new "## Appareils mobiles"
# gui/game/gui.rpy:441
old "## Change the size and spacing of various things."
new "## Changer la taille et l'espacement de diverses choses."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Active la vérification de propriétés invalides ou instables dans les screens et transforms"
old "## This file contains options that can be changed to customize your game."
@@ -45,9 +44,9 @@ translate french strings:
old "## Sounds and music"
new "## Sons et musiques"
# 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 "## Ces trois variables contrôlent quels mixeurs sont affichés au joueur par défaut. Configurer l’un de ceux-ci à False (Faux) cachera le mixeur concerné."
# 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 "## Ces trois variables contrôlent, entre autres, quels mixeurs sont affichés au joueur par défaut. Configurer l’un de ceux-ci à False (Faux) cachera le mixeur concerné."
# 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."
@@ -155,7 +154,7 @@ translate french strings:
# options.rpy:165
old "## In a pattern:"
new "## Dans le format:"
new "## Dans le format:"
# options.rpy:167
old "## / is the directory separator."
@@ -186,9 +185,21 @@ translate french strings:
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."
new "## Le nom d’utilisateur et du projet associé au projet itch.io, séparé par un slash."
# 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 "## Texte placé sur l'écran \"À propos\" du jeu. Placez le texte entre triples guillemets, et laissez une ligne entre les paragraphes."
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"
@@ -55,7 +54,7 @@ translate french 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 "## 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"
@@ -163,7 +162,7 @@ translate french 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 "## 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"
@@ -171,11 +170,11 @@ translate french strings:
# 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"
@@ -183,7 +182,7 @@ translate french strings:
# 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."
@@ -451,7 +450,7 @@ translate french strings:
# 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"
@@ -622,8 +621,8 @@ translate french strings:
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."
@@ -640,3 +639,103 @@ translate french strings:
# screens.rpy:1429
old "Menu"
new "Menu"
# 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 "## Si il y a une side image, l'afficher au-dessus du texte. Ne pas l'afficher sur la version téléphone - pas assez de place."
# gui/game/screens.rpy:120
old "## Make the namebox available for styling through the Character object."
new "## Rendre la boîte du nom personnalisable à travers l'objet Character."
# gui/game/screens.rpy:172
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:205
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:245
old "## Ensure this appears on top of other screens."
new "## Assure qu'il apparaît au-dessus des autres screens."
# gui/game/screens.rpy:284
old "## Main and Game Menu Screens"
new "## Screens du menu principal et du menu de jeu"
# gui/game/screens.rpy:333
old "## The quit button is banned on iOS and unnecessary on Android and Web."
new "## Le bouton pour quitter est banni sur iOS et inutile sur Android et sur le Web."
# gui/game/screens.rpy:352
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:356
old "## This ensures that any other menu screen is replaced."
new "## Ceci assure que tout autre screen de menu est remplacé."
# gui/game/screens.rpy:361
old "## This empty frame darkens the main menu."
new "## Cette frame vide obscurcit le menu principal."
# gui/game/screens.rpy:433
old "## Reserve space for the navigation section."
new "## Réserve de l'expace pour la section de navigation."
# gui/game/screens.rpy:612
old "## The page name, which can be edited by clicking on a button."
new "## Le nom de la page, qui peut être modifié en cliquant sur un bouton."
# gui/game/screens.rpy:669
old "## range(1, 10) gives the numbers from 1 to 9."
new "## range(1, 10) donne les nombres de 1 à 9."
# gui/game/screens.rpy:919
old "## This determines what tags are allowed to be displayed on the history screen."
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"
# gui/game/screens.rpy:1078
old "Left Trigger\nLeft Shoulder"
new "Gâchettes gauche"
# gui/game/screens.rpy:1135
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:1244
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
new "## Nous devons utiliser une police qui a le glyphe BLACK RIGHT-POINTING SMALL TRIANGLE."
# gui/game/screens.rpy:1292
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: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"
new "Sind Sie sicher, dass sie die Szenen-Wiederholung beenden möchten?"
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
new "Sind Sie sicher, dass Sie vorspulen möchten?"
new "Sind Sie sicher, dass Sie Text überspringen möchten?"
# 00gui.rpy:235
old "Are you sure you want to skip to the next choice?"
new "Sind Sie sicher, dass Sie zur nächsten Auswahl vorspulen möchten?"
new "Sind Sie sicher, dass Sie zur nächsten Auswahl springen möchten?"
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Are you sure you want to skip unseen dialogue to the next choice?"
new "Sind Sie sicher, dass sie ungesehenen Dialog bis zur nächsten Entscheidung überspringen möchten?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
@@ -207,75 +207,78 @@ translate german strings:
# 00library.rpy:142
old "Self-voicing disabled."
new "Self-voicing disabled."
new "Sprachausgabe deaktiviert."
# 00library.rpy:143
old "Clipboard voicing enabled. "
new "Clipboard voicing enabled. "
# Automatic translation.
new "Zwischenablage-Voicing aktiviert. "
# 00library.rpy:144
old "Self-voicing enabled. "
new "Self-voicing enabled. "
new "Sprachausgabe aktiviert. "
# 00library.rpy:179
old "Skip Mode"
new "Vorspulen"
new "Skip-Modus"
# 00library.rpy:262
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
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}."
new "Dieses Programm enthält kostenlose Software unter einer Reihe von Lizenzen, einschließlich der MIT License und der GNU Lesser General Public License. Eine vollständige Liste aller Software, inklusive Links zum vollständigen Quellcode, kann {a=https://www.renpy.org/l/license}hier{/a} gefunden werden."
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Clipboard voicing enabled. Press 'shift+C' to disable."
# Automatic translation.
new "Zwischenablage-Voicing aktiviert. Drücken Sie 'Umschalt+C' zum Deaktivieren."
# 00preferences.rpy:424
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Sprachausgabe würde \"[renpy.display.tts.last]\" sagen. Zum deaktivieren 'alt+shift+V' drücken."
# 00preferences.rpy:426
old "Self-voicing enabled. Press 'v' to disable."
new "Self-voicing enabled. Press 'v' to disable."
new "Sprachausgabe aktiviert. Zum deaktivieren 'v' drücken."
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
new "Kontaktiert App Store\nBitte warten..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
new "The Ren'Py Updater is not supported on mobile devices."
new "Der Ren'Py Updater wird auf Mobilgeräten nicht unterstützt."
# 00updater.rpy:486
old "An error is being simulated."
new "An error is being simulated."
new "Ein Error wird simuliert."
# 00updater.rpy:662
old "Either this project does not support updating, or the update status file was deleted."
new "Either this project does not support updating, or the update status file was deleted."
new "Entweder unterstützt dieses Projekt keine Updates, oder die Update-Status-Datei wurde gelöscht."
# 00updater.rpy:676
old "This account does not have permission to perform an update."
new "This account does not have permission to perform an update."
new "Dieser Account hat keine Erlaubnis, Updates durchzuführen."
# 00updater.rpy:679
old "This account does not have permission to write the update log."
new "This account does not have permission to write the update log."
new "Dieser Account hat keine Erlaubnis, Update-Logs zu schreiben."
# 00updater.rpy:704
old "Could not verify update signature."
new "Could not verify update signature."
new "Konnte die Update-Signatur nicht verifizieren."
# 00updater.rpy:975
old "The update file was not downloaded."
new "The update file was not downloaded."
new "Die Update-Datei wurde nicht heruntergeladen."
# 00updater.rpy:993
old "The update file does not have the correct digest - it may have been corrupted."
new "The update file does not have the correct digest - it may have been corrupted."
new "Die Update-Datei hat nicht das richtige Format - sie wurde möglicherweise beschädigt."
# 00updater.rpy:1049
old "While unpacking {}, unknown type {}."
new "While unpacking {}, unknown type {}."
# Automatic translation.
new "Beim Auspacken {}, unbekannter Typ {}."
# 00updater.rpy:1393
old "Updater"
@@ -283,7 +286,7 @@ translate german strings:
# 00updater.rpy:1404
old "This program is up to date."
new "Dieses Programm ist aktuell."
new "Dieses Programm ist auf dem neuesten Stand."
# 00updater.rpy:1406
old "[u.version] is available. Do you want to install it?"
@@ -291,27 +294,27 @@ translate german strings:
# 00updater.rpy:1408
old "Preparing to download the updates."
new "Vorbereiten, um die Aktualisierungen herunterzuladen."
new "Bereitet das Herunterladen der Updates vor."
# 00updater.rpy:1410
old "Downloading the updates."
new "Aktualisierungen werden heruntergeladen."
new "Updates werden heruntergeladen."
# 00updater.rpy:1412
old "Unpacking the updates."
new "Aktualisierungen werden entpackt."
new "Updates werden entpackt."
# 00updater.rpy:1416
old "The updates have been installed. The program will restart."
new "Die Aktualisierungen wurden installiert. Das Programm wird nun neustarten."
new "Die Updates wurden installiert. Das Programm wird nun neu gestartet."
# 00updater.rpy:1418
old "The updates have been installed."
new "Die Aktualisierungen wurden installiert."
new "Die Updates wurden installiert."
# 00updater.rpy:1420
old "The updates were cancelled."
new "Die Aktualisierungen wurden abgebrochen."
new "Die Updates wurden abgebrochen."
# 00gallery.rpy:563
old "Image [index] of [count] locked."
@@ -327,9 +330,663 @@ translate german strings:
# 00gallery.rpy:585
old "slideshow"
new "slideshow"
# Automatic translation.
new "Diashow"
# 00gallery.rpy:586
old "return"
new "zurück"
translate german strings:
# renpy/common/00accessibility.rpy:32
old "bar"
new "bar"
# renpy/common/00accessibility.rpy:33
old "selected"
# Automatic translation.
new "ausgewählt"
# renpy/common/00accessibility.rpy:34
old "viewport"
# Automatic translation.
new "Ansichtsfenster"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
# Automatic translation.
new "Horizontales Blättern"
# renpy/common/00accessibility.rpy:36
old "vertical scroll"
# Automatic translation.
new "vertikaler Bildlauf"
# renpy/common/00accessibility.rpy:37
old "activate"
# Automatic translation.
new "aktivieren."
# renpy/common/00accessibility.rpy:38
old "deactivate"
# Automatic translation.
new "deaktivieren"
# renpy/common/00accessibility.rpy:39
old "increase"
# Automatic translation.
new "erhöhen."
# renpy/common/00accessibility.rpy:40
old "decrease"
# Automatic translation.
new "verringern"
# renpy/common/00accessibility.rpy:138
old "Font Override"
# Automatic translation.
new "Schriftart überschreiben"
# renpy/common/00accessibility.rpy:142
old "Default"
# Automatic translation.
new "Standard"
# renpy/common/00accessibility.rpy:146
old "DejaVu Sans"
new "DejaVu Sans"
# renpy/common/00accessibility.rpy:150
old "Opendyslexic"
new "Opendyslexic"
# renpy/common/00accessibility.rpy:156
old "Text Size Scaling"
# Automatic translation.
new "Skalierung der Textgröße"
# renpy/common/00accessibility.rpy:162
old "Reset"
# Automatic translation.
new "Zurücksetzen"
# renpy/common/00accessibility.rpy:168
old "Line Spacing Scaling"
# Automatic translation.
new "Zeilenabstand Skalierung"
# renpy/common/00accessibility.rpy:180
old "High Contrast Text"
# Automatic translation.
new "Hochkontrastiger Text"
# renpy/common/00accessibility.rpy:193
old "Self-Voicing"
# Automatic translation.
new "Selbstanzeige"
# renpy/common/00accessibility.rpy:197
old "Off"
# Automatic translation.
new "Aus"
# renpy/common/00accessibility.rpy:201
old "Text-to-speech"
# Automatic translation.
new "Text-in-Sprache"
# renpy/common/00accessibility.rpy:205
old "Clipboard"
# Automatic translation.
new "Zwischenablage"
# renpy/common/00accessibility.rpy:209
old "Debug"
# Automatic translation.
new "Debuggen"
# renpy/common/00accessibility.rpy:223
old "Self-Voicing Volume Drop"
# Automatic translation.
new "Selbstlautstärkeabfall"
# 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."
# Automatic translation.
new "Die Optionen in diesem Menü dienen der Verbesserung der Zugänglichkeit. Sie funktionieren möglicherweise nicht mit allen Spielen, und einige Kombinationen von Optionen können das Spiel unspielbar machen. Dies ist kein Problem mit dem Spiel oder der Engine. Die besten Ergebnisse beim Ändern von Schriftarten erzielen Sie, wenn Sie die ursprüngliche Textgröße beibehalten."
# renpy/common/00action_file.rpy:378
old "Save slot %s: [text]"
# Automatic translation.
new "Steckplatz %s speichern: [text]"
# renpy/common/00action_file.rpy:461
old "Load slot %s: [text]"
# Automatic translation.
new "Steckplatz %s laden: [text]"
# renpy/common/00action_file.rpy:514
old "Delete slot [text]"
# Automatic translation.
new "Steckplatz löschen [text]"
# renpy/common/00action_file.rpy:593
old "File page auto"
# Automatic translation.
new "Datei Seite auto"
# renpy/common/00action_file.rpy:595
old "File page quick"
# Automatic translation.
new "Datei Seite schnell"
# renpy/common/00action_file.rpy:597
old "File page [text]"
# Automatic translation.
new "Datei-Seite [text]"
# renpy/common/00action_file.rpy:796
old "Next file page."
# Automatic translation.
new "Nächste Dateiseite."
# renpy/common/00action_file.rpy:868
old "Previous file page."
# Automatic translation.
new "Vorherige Dateiseite."
# renpy/common/00action_file.rpy:944
old "Quick save."
# Automatic translation.
new "Schnell speichern."
# renpy/common/00action_file.rpy:963
old "Quick load."
# Automatic translation.
new "Schnell laden."
# renpy/common/00action_other.rpy:381
old "Language [text]"
# Automatic translation.
new "Sprache [text]"
# renpy/common/00director.rpy:705
old "The interactive director is not enabled here."
# Automatic translation.
new "Der interaktive Regisseur ist hier nicht aktiviert."
# renpy/common/00director.rpy:1504
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1510
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1574
old "Done"
# Automatic translation.
new "Erledigt"
# renpy/common/00director.rpy:1584
old "(statement)"
# Automatic translation.
new "(Erklärung)"
# renpy/common/00director.rpy:1585
old "(tag)"
# Automatic translation.
new "(Tag)"
# renpy/common/00director.rpy:1586
old "(attributes)"
# Automatic translation.
new "(Attribute)"
# renpy/common/00director.rpy:1587
old "(transform)"
new "(transform)"
# renpy/common/00director.rpy:1612
old "(transition)"
new "(transition)"
# renpy/common/00director.rpy:1624
old "(channel)"
# Automatic translation.
new "(Kanal)"
# renpy/common/00director.rpy:1625
old "(filename)"
# Automatic translation.
new "(Dateiname)"
# renpy/common/00director.rpy:1654
old "Change"
# Automatic translation.
new "Ändern Sie"
# renpy/common/00director.rpy:1656
old "Add"
# Automatic translation.
new "hinzufügen"
# renpy/common/00director.rpy:1662
old "Remove"
# Automatic translation.
new "entfernen"
# renpy/common/00director.rpy:1697
old "Statement:"
# Automatic translation.
new "Erklärung:"
# renpy/common/00director.rpy:1718
old "Tag:"
new "Tag:"
# renpy/common/00director.rpy:1734
old "Attributes:"
# Automatic translation.
new "Attribute:"
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
# Automatic translation.
new "Klicken Sie auf das Attribut, um es einzuschalten, klicken Sie mit der rechten Maustaste, um das negative Attribut einzuschalten."
# renpy/common/00director.rpy:1757
old "Transforms:"
# Automatic translation.
new "Verwandeln:"
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
# Automatic translation.
new "Klicken Sie, um die Transformation festzulegen, und klicken Sie mit der rechten Maustaste, um sie zur Transformationsliste hinzuzufügen."
# renpy/common/00director.rpy:1780
old "Behind:"
# Automatic translation.
new "Hinter:"
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
# Automatic translation.
new "Zum Einstellen klicken, zum Hinzufügen zur Liste mit der rechten Maustaste klicken."
# renpy/common/00director.rpy:1801
old "Transition:"
# Automatic translation.
new "Überleitung:"
# renpy/common/00director.rpy:1819
old "Channel:"
# Automatic translation.
new "Kanal:"
# renpy/common/00director.rpy:1837
old "Audio Filename:"
# Automatic translation.
new "Audio Dateiname:"
# renpy/common/00gui.rpy:456
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
# Automatic translation.
new "Dieser Spielstand wurde auf einem anderen Gerät erstellt. Böswillig erstellte Speicherdateien können Ihrem Computer schaden. Vertrauen Sie dem Ersteller dieses Spielstands und allen, die die Datei geändert haben könnten?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
# Automatic translation.
new "Vertrauen Sie dem Gerät, auf dem die Sicherung erstellt wurde? Sie sollten nur dann Ja wählen, wenn Sie der einzige Benutzer des Geräts sind."
# renpy/common/00keymap.rpy:322
old "Failed to save screenshot as %s."
# Automatic translation.
new "Bildschirmfoto konnte nicht als %s gespeichert werden."
# renpy/common/00preferences.rpy:271
old "display"
# Automatic translation.
new "Anzeige"
# renpy/common/00preferences.rpy:283
old "transitions"
# Automatic translation.
new "Übergänge"
# renpy/common/00preferences.rpy:292
old "skip transitions"
# Automatic translation.
new "Übergänge überspringen"
# renpy/common/00preferences.rpy:294
old "video sprites"
# Automatic translation.
new "Video-Sprites"
# renpy/common/00preferences.rpy:303
old "show empty window"
# Automatic translation.
new "leeres Fenster anzeigen"
# renpy/common/00preferences.rpy:312
old "text speed"
# Automatic translation.
new "Textgeschwindigkeit"
# renpy/common/00preferences.rpy:320
old "joystick"
# Automatic translation.
new "Joystick"
# renpy/common/00preferences.rpy:320
old "joystick..."
# Automatic translation.
new "Joystick..."
# renpy/common/00preferences.rpy:327
old "skip"
# Automatic translation.
new "überspringen"
# renpy/common/00preferences.rpy:330
old "skip unseen [text]"
# Automatic translation.
new "unbesehen überspringen [text]"
# renpy/common/00preferences.rpy:335
old "skip unseen text"
# Automatic translation.
new "ungesehenen Text übergehen"
# renpy/common/00preferences.rpy:337
old "begin skipping"
# Automatic translation.
new "mit dem Springen beginnen"
# renpy/common/00preferences.rpy:341
old "after choices"
# Automatic translation.
new "nach der Wahl"
# renpy/common/00preferences.rpy:348
old "skip after choices"
# Automatic translation.
new "nach Auswahlen überspringen"
# renpy/common/00preferences.rpy:350
old "auto-forward time"
# Automatic translation.
new "automatische Vorlaufzeit"
# renpy/common/00preferences.rpy:364
old "auto-forward"
# Automatic translation.
new "automatisches Weiterleiten"
# renpy/common/00preferences.rpy:371
old "Auto forward"
# Automatic translation.
new "Automatisch vorwärts"
# renpy/common/00preferences.rpy:374
old "auto-forward after click"
# Automatic translation.
new "automatisches Weiterleiten nach Klick"
# renpy/common/00preferences.rpy:383
old "automatic move"
# Automatic translation.
new "automatischer Umzug"
# renpy/common/00preferences.rpy:392
old "wait for voice"
# Automatic translation.
new "auf Stimme warten"
# renpy/common/00preferences.rpy:401
old "voice sustain"
# Automatic translation.
new "Stimmhaltung"
# renpy/common/00preferences.rpy:410
old "self voicing"
# Automatic translation.
new "selbststimmend"
# renpy/common/00preferences.rpy:419
old "self voicing volume drop"
# Automatic translation.
new "Selbststimmende Lautstärkeabnahme"
# renpy/common/00preferences.rpy:427
old "clipboard voicing"
# Automatic translation.
new "Clipboard-Intonation"
# renpy/common/00preferences.rpy:436
old "debug voicing"
# Automatic translation.
new "Intonation debuggen"
# renpy/common/00preferences.rpy:445
old "emphasize audio"
# Automatic translation.
new "Audio hervorheben"
# renpy/common/00preferences.rpy:454
old "rollback side"
# Automatic translation.
new "Rollback-Seite"
# renpy/common/00preferences.rpy:464
old "gl powersave"
new "gl powersave"
# renpy/common/00preferences.rpy:470
old "gl framerate"
# Automatic translation.
new "Gl-Framerate"
# renpy/common/00preferences.rpy:473
old "gl tearing"
new "gl tearing"
# renpy/common/00preferences.rpy:476
old "font transform"
# Automatic translation.
new "Schriftart umwandeln"
# renpy/common/00preferences.rpy:479
old "font size"
# Automatic translation.
new "Schriftgröße"
# renpy/common/00preferences.rpy:487
old "font line spacing"
# Automatic translation.
new "Zeilenabstand der Schrift"
# renpy/common/00preferences.rpy:495
old "system cursor"
# Automatic translation.
new "System-Cursor"
# renpy/common/00preferences.rpy:504
old "renderer menu"
# Automatic translation.
new "Renderer-Menü"
# renpy/common/00preferences.rpy:507
old "accessibility menu"
# Automatic translation.
new "Menü Barrierefreiheit"
# renpy/common/00preferences.rpy:510
old "high contrast text"
# Automatic translation.
new "Text mit hohem Kontrast"
# renpy/common/00preferences.rpy:519
old "audio when minimized"
# Automatic translation.
new "Audio im minimierten Zustand"
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
# Automatic translation.
new "Audio bei Unschärfe"
# renpy/common/00preferences.rpy:537
old "web cache preload"
# Automatic translation.
new "Web-Cache vorladen"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
# Automatic translation.
new "Stimme nach dem Spielmenü"
# renpy/common/00preferences.rpy:571
old "main volume"
# Automatic translation.
new "Hauptvolumen"
# renpy/common/00preferences.rpy:572
old "music volume"
# Automatic translation.
new "Musiklautstärke"
# renpy/common/00preferences.rpy:573
old "sound volume"
# Automatic translation.
new "Lautstärke"
# renpy/common/00preferences.rpy:574
old "voice volume"
# Automatic translation.
new "Sprachlautstärke"
# renpy/common/00preferences.rpy:575
old "mute main"
# Automatic translation.
new "Hauptstummschaltung"
# renpy/common/00preferences.rpy:576
old "mute music"
# Automatic translation.
new "Musik stummschalten"
# renpy/common/00preferences.rpy:577
old "mute sound"
# Automatic translation.
new "Ton stummschalten"
# renpy/common/00preferences.rpy:578
old "mute voice"
# Automatic translation.
new "stumme Stimme"
# renpy/common/00preferences.rpy:579
old "mute all"
# Automatic translation.
new "alle stumm schalten"
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
# Automatic translation.
new "Sprechblasen-Editor"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
# Automatic translation.
new "(ausblenden)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
# Automatic translation.
new "Sync heruntergeladen."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
# Automatic translation.
new "Es konnte keine Verbindung zum Ren'Py Sync Server hergestellt werden."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
# Automatic translation.
new "Der Ren'Py Sync-Server hat eine Zeitüberschreitung."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
# Automatic translation.
new "Bei der Verbindung mit dem Ren'Py Sync-Server ist ein unbekannter Fehler aufgetreten."
# renpy/common/00sync.rpy:267
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
# Automatic translation.
new "Der Ren'Py Sync-Server verfügt nicht über eine Kopie dieser Synchronisierung. Die Sync-ID ist möglicherweise ungültig, oder es wurde eine Zeitüberschreitung festgestellt."
# renpy/common/00sync.rpy:409
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
# Automatic translation.
new "Bitte geben Sie die von Ihnen erstellte Sync-ID ein.\nGeben Sie niemals eine Sync-ID ein, die Sie nicht selbst erstellt haben."
# renpy/common/00sync.rpy:428
old "The sync ID is not in the correct format."
# Automatic translation.
new "Die Sync-ID hat nicht das richtige Format."
# renpy/common/00sync.rpy:448
old "The sync could not be decrypted."
# Automatic translation.
new "Die Synchronisierung konnte nicht entschlüsselt werden."
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
# Automatic translation.
new "Die Synchronisation gehört zu einem anderen Spiel."
# renpy/common/00sync.rpy:476
old "The sync contains a file with an invalid name."
# Automatic translation.
new "Die Synchronisierung enthält eine Datei mit einem ungültigen Namen."
# renpy/common/00sync.rpy:529
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
# Automatic translation.
new "Dadurch werden Ihre Spielstände auf den {a=https://sync.renpy.org}Ren'Py Sync Server{/a} hochgeladen.\nMöchten Sie fortfahren?"
# renpy/common/00sync.rpy:558
old "Enter Sync ID"
# Automatic translation.
new "Sync-ID eingeben"
# renpy/common/00sync.rpy:569
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
# Automatic translation.
new "Dadurch wird der {a=https://sync.renpy.org}Ren'Py Sync Server{/a} kontaktiert."
# renpy/common/00sync.rpy:596
old "Sync Success"
# Automatic translation.
new "Sync-Erfolg"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
# Automatic translation.
new "Die Sync-ID lautet:"
# renpy/common/00sync.rpy:605
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
# Automatic translation.
new "Sie können diese ID verwenden, um Ihren Spielstand auf ein anderes Gerät herunterzuladen.\nDiese Synchronisierung läuft in einer Stunde ab.\nRen'Py Sync wird unterstützt von {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
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}✔ vorhergesagtes Bild (gut){/color}\n{color=#fcc}✘ unvorhergesehenes Bild (schlecht){/color}\n{color=#fff}Zum Verschieben ziehen.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
@@ -91,7 +94,8 @@ translate german strings:
# _developer/inspector.rpym:71
old "Location"
new "Location"
# Automatic translation.
new "Standort"
# _developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
@@ -177,3 +181,110 @@ translate german strings:
old "jump <label>: jumps to label"
new "jump <label>: springt zum Label"
translate german strings:
# renpy/common/_developer/developer.rpym:43
old "Interactive Director (D)"
# Automatic translation.
new "Interaktiver Direktor (D)"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
# Automatic translation.
new "Dauerhafter Betrachter"
# renpy/common/_developer/developer.rpym:59
old "Show Image Load Log (F4)"
# Automatic translation.
new "Bildladeprotokoll anzeigen (F4)"
# renpy/common/_developer/developer.rpym:62
old "Hide Image Load Log (F4)"
# Automatic translation.
new "Bildladeprotokoll ausblenden (F4)"
# renpy/common/_developer/developer.rpym:65
old "Image Attributes"
# Automatic translation.
new "Bild-Attribute"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
# Automatic translation.
new "Sprechblasen-Editor (Umschalt+B)"
# renpy/common/_developer/developer.rpym:97
old "[name] [attributes] (hidden)"
# Automatic translation.
new "[name] [attributes] (versteckt)"
# renpy/common/_developer/developer.rpym:101
old "[name] [attributes]"
new "[name] [attributes]"
# renpy/common/_developer/developer.rpym:162
old "Hide deleted"
# Automatic translation.
new "Ausblenden gelöscht"
# renpy/common/_developer/developer.rpym:162
old "Show deleted"
# Automatic translation.
new "Anzeigen gelöscht"
# renpy/common/_developer/developer.rpym:389
old "Type to filter: "
# Automatic translation.
new "Typ zum Filtern: "
# renpy/common/_developer/developer.rpym:507
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
# Automatic translation.
new "Texturen: [tex_count] ([tex_size_mb:.1f] MB)"
# renpy/common/_developer/developer.rpym:511
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# Automatic translation.
new "Bild-Cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
# Automatic translation.
new "help: diese Hilfe anzeigen\n help <expr>: Signatur und Dokumentation von <expr> anzeigen"
# renpy/common/00console.rpy:813
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
# Automatic translation.
new "Die Hilfe kann undokumentierte Funktionen anzeigen. Bitte prüfen Sie, ob die Funktion oder\nKlasse, die Sie verwenden möchten, dokumentiert ist.\n\n"
# renpy/common/00console.rpy:854
old "stack: print the return stack"
# Automatic translation.
new "stack: den Rückgabestapel drucken"
# 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>: einen Python-Ausdruck beobachten\n watch short: macht die Darstellung der nachverfolgten Ausdrücke kurz (Standard)\n watch long: macht die Darstellung von verfolgten Ausdrücken wie folgt"
# renpy/common/00console.rpy:1028
old "short: Shorten the representation of objects on the console (default)."
# Automatic translation.
new "short: Verkürzt die Darstellung von Objekten auf der Konsole (Standard)."
# renpy/common/00console.rpy:1032
old "long: Print the full representation of objects on the console."
# Automatic translation.
new "long: Gibt die vollständige Darstellung der Objekte auf der Konsole aus."
# renpy/common/00console.rpy:1036
old "escape: Enables escaping of unicode symbols in unicode strings."
# Automatic translation.
new "escape: Ermöglicht das Escaping von Unicode-Symbolen in Unicode-Strings."
# renpy/common/00console.rpy:1040
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
# Automatic translation.
new "unescape: Deaktiviert das Escaping von Unicode-Symbolen in Unicode-Zeichenfolgen und druckt sie so, wie sie sind (Voreinstellung)."
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."
# Automatic translation.
new "## Die Anweisung init offset bewirkt, dass der init-Code in dieser Datei vor dem init-Code in jeder anderen Datei ausgeführt wird."
# 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."
# Automatic translation.
new "## Der Aufruf von gui.init setzt die Stile auf sinnvolle Standardwerte zurück und setzt die Breite und Höhe des Spiels."
# gui.rpy:21
old "## Colors"
new "## Colors"
# Automatic translation.
new "## Farben"
# gui.rpy:23
old "## The colors of text in the interface."
new "## The colors of text in the interface."
# Automatic translation.
new "## Die Farben des Textes in der Schnittstelle."
# 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."
# Automatic translation.
new "## Eine Akzentfarbe, die in der gesamten Benutzeroberfläche zur Beschriftung und Hervorhebung von Text verwendet wird."
# 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."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie weder ausgewählt ist noch mit dem Mauszeiger bewegt wird."
# 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."
# Automatic translation.
new "## Die kleine Farbe wird für kleinen Text verwendet, der heller/dunkler sein muss, um den gleichen Effekt zu erzielen."
# 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."
# Automatic translation.
new "## Die Farbe, die für Schaltflächen und Balken verwendet wird, die mit dem Mauszeiger bewegt werden."
# 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."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie ausgewählt, aber nicht fokussiert ist. Eine Schaltfläche ist ausgewählt, wenn sie der aktuelle Bildschirm oder Einstellungswert ist."
# 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."
# Automatic translation.
new "## Die Farbe, die für eine Textschaltfläche verwendet wird, wenn sie nicht ausgewählt werden kann."
# 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."
# Automatic translation.
new "## Farben für die Teile der Balken, die nicht ausgefüllt sind. Diese Farben werden nicht direkt verwendet, aber bei der Neuerstellung von Balkenbilddateien eingesetzt."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## The colors used for dialogue and menu choice text."
# Automatic translation.
new "## Die Farben, die für Dialog- und Menüauswahltext verwendet werden."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fonts and Font Sizes"
# Automatic translation.
new "## Schriftarten und Schriftgrößen"
# gui.rpy:58
old "## The font used for in-game text."
new "## The font used for in-game text."
# Automatic translation.
new "## Die für den Text im Spiel verwendete Schriftart."
# gui.rpy:61
old "## The font used for character names."
new "## The font used for character names."
# Automatic translation.
new "## Die für Zeichennamen verwendete Schriftart."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## The font used for out-of-game text."
# Automatic translation.
new "## Die Schriftart, die für den Text außerhalb des Spiels verwendet wird."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## The size of normal dialogue text."
# Automatic translation.
new "## Die Größe des normalen Dialogtextes."
# gui.rpy:70
old "## The size of character names."
new "## The size of character names."
# Automatic translation.
new "## Die Größe der Zeichennamen."
# 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."
# Automatic translation.
new "## Die Größe des Textes in der Benutzeroberfläche des Spiels."
# 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."
# Automatic translation.
new "## Die Größe der Beschriftungen in der Benutzeroberfläche des Spiels."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## The size of text on the notify screen."
# Automatic translation.
new "## Die Größe des Textes auf dem Benachrichtigungsbildschirm."
# gui.rpy:82
old "## The size of the game's title."
new "## The size of the game's title."
# Automatic translation.
new "## Die Größe des Titels des Spiels."
# gui.rpy:86
old "## Main and Game Menus"
new "## Main and Game Menus"
# Automatic translation.
new "## Haupt- und Spielmenü"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## The images used for the main and game menus."
# Automatic translation.
new "## Die Bilder, die für das Haupt- und das Spielmenü verwendet werden."
# 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?"
# Automatic translation.
new "## Sollten wir den Namen und die Version des Spiels anzeigen?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogue"
# Automatic translation.
new "*Dialog"
# 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."
# Automatic translation.
new "## Diese Variablen steuern, wie der Dialog zeilenweise auf dem Bildschirm angezeigt wird."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## The height of the textbox containing dialogue."
# Automatic translation.
new "## Die Höhe des Textfeldes, das den Dialog enthält."
# 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."
# Automatic translation.
new "## Die Platzierung des Textfeldes vertikal auf dem Bildschirm. 0.0 ist der obere Rand, 0.5 ist die Mitte und 1.0 ist der untere Rand."
# 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."
# Automatic translation.
new "## Die Platzierung des Namens des sprechenden Charakters, relativ zum Textfeld. Dies kann eine ganze Anzahl von Pixeln von links oder oben sein, oder 0,5 bis zur Mitte."
# 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."
# Automatic translation.
new "## Die horizontale Ausrichtung des Namens des Zeichens. Dies kann 0.0 für linksbündig, 0.5 für zentriert und 1.0 für rechtsbündig sein."
# 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."
# Automatic translation.
new "## Die Breite, die Höhe und die Ränder des Feldes, das den Namen des Zeichens enthält, oder None, um es automatisch zu vergrößern."
# 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."
# Automatic translation.
new "## Die Ränder des Feldes, das den Namen des Zeichens enthält, in der Reihenfolge links, oben, rechts, unten."
# 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."
# Automatic translation.
new "## Wenn True, wird der Hintergrund des Namensfeldes gekachelt, wenn False, wird der Hintergrund des Namensfeldes skaliert."
# 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."
# Automatic translation.
new "## Die Platzierung des Dialogs relativ zum Textfeld. Dies kann eine ganze Anzahl von Pixeln relativ zur linken oder oberen Seite des Textfeldes oder 0,5 zur Mitte sein."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## The maximum width of dialogue text, in pixels."
# Automatic translation.
new "## Die maximale Breite des Dialogtextes, in Pixeln."
# 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."
# Automatic translation.
new "## Die horizontale Ausrichtung des Dialogtextes. Dies kann 0.0 für linksbündig, 0.5 für zentriert und 1.0 für rechtsbündig sein."
# gui.rpy:146
old "## Buttons"
new "## Buttons"
# Automatic translation.
new "## Schaltflächen"
# 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."
# Automatic translation.
new "## Diese Variablen, zusammen mit den Bilddateien in gui/button, steuern Aspekte der Darstellung von Schaltflächen."
# 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."
# Automatic translation.
new "## Die Breite und Höhe einer Schaltfläche, in Pixeln. Falls keine, berechnet Ren'Py eine Größe."
# 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."
# Automatic translation.
new "## Die Ränder auf jeder Seite der Schaltfläche, in der Reihenfolge links, oben, rechts, unten."
# 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."
# Automatic translation.
new "## Wenn True, wird das Hintergrundbild gekachelt. Wenn False, wird das Hintergrundbild linear skaliert."
# gui.rpy:162
old "## The font used by the button."
new "## The font used by the button."
# Automatic translation.
new "## Die von der Schaltfläche verwendete Schriftart."
# gui.rpy:165
old "## The size of the text used by the button."
new "## The size of the text used by the button."
# Automatic translation.
new "## Die Größe des von der Schaltfläche verwendeten Textes."
# 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."
# Automatic translation.
new "## Diese Variablen überschreiben die Einstellungen für verschiedene Arten von Schaltflächen. Bitte lesen Sie in der Gui-Dokumentation nach, welche Arten von Schaltflächen verfügbar sind und wofür sie jeweils verwendet werden."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## These customizations are used by the default interface:"
# Automatic translation.
new "## Diese Anpassungen werden von der Standardschnittstelle verwendet:"
# 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."
# Automatic translation.
new "## Sie können auch Ihre eigenen Anpassungen hinzufügen, indem Sie Variablen mit den richtigen Namen hinzufügen. Zum Beispiel können Sie die folgende Zeile auskommentieren, um die Breite einer Navigationsschaltfläche festzulegen."
# gui.rpy:205
old "## Choice Buttons"
new "## Choice Buttons"
# Automatic translation.
new "## Auswahltasten"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Choice buttons are used in the in-game menus."
# Automatic translation.
new "## Wahltasten werden in den Menüs im Spiel verwendet."
# gui.rpy:220
old "## File Slot Buttons"
new "## File Slot Buttons"
# Automatic translation.
new "## Datei Slot Schaltflächen"
# 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."
# Automatic translation.
new "## Eine Dateislot-Schaltfläche ist eine besondere Art von Schaltfläche. Er enthält ein Miniaturbild und einen Text, der den Inhalt des Speicherplatzes beschreibt. Ein Speicherslot verwendet Bilddateien in gui/button, wie die anderen Arten von Schaltflächen."
# gui.rpy:226
old "## The save slot button."
new "## The save slot button."
# Automatic translation.
new "## Die Schaltfläche \"Slot speichern\"."
# 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."
# Automatic translation.
new "## Die Breite und Höhe der Miniaturbilder, die von den Speicherplätzen verwendet werden."
# 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."
# Automatic translation.
new "## Die Anzahl der Spalten und Zeilen im Raster der Speicherplätze."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Positioning and Spacing"
# Automatic translation.
new "## Positionierung und Abstände"
# 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."
# Automatic translation.
new "## Diese Variablen steuern die Positionierung und den Abstand der verschiedenen Elemente der Benutzeroberfläche."
# 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."
# Automatic translation.
new "## Die Position der linken Seite der Navigationstasten, relativ zur linken Seite des Bildschirms."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## The vertical position of the skip indicator."
# Automatic translation.
new "## Die vertikale Position des Überspringungsanzeigers."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## The vertical position of the notify screen."
# Automatic translation.
new "## Die vertikale Position des Benachrichtigungsbildschirms."
# gui.rpy:258
old "## The spacing between menu choices."
new "## The spacing between menu choices."
# Automatic translation.
new "## Die Abstände zwischen den Menüoptionen."
# 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."
# Automatic translation.
new "## Schaltflächen im Navigationsbereich des Haupt- und Spielmenüs."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Controls the amount of spacing between preferences."
# Automatic translation.
new "## Steuert den Abstand zwischen den Einstellungen."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Controls the amount of spacing between preference buttons."
# Automatic translation.
new "## Steuert den Abstand zwischen den Einstellungsschaltflächen."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## The spacing between file page buttons."
# Automatic translation.
new "## Der Abstand zwischen den Schaltflächen der Dateiseite."
# gui.rpy:273
old "## The spacing between file slots."
new "## The spacing between file slots."
# Automatic translation.
new "## Der Abstand zwischen den Dateislots."
# gui.rpy:277
old "## Frames"
@@ -271,141 +337,243 @@ translate german strings:
# gui.rpy:279
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# Automatic translation.
new "## Diese Variablen steuern das Aussehen von Frames, die Komponenten der Benutzeroberfläche enthalten können, wenn kein Overlay oder Fenster vorhanden ist."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Generic frames that are introduced by player code."
# Automatic translation.
new "## Generische Frames, die vom Player-Code eingeführt werden."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
new "## The frame that is used as part of the confirm screen."
# Automatic translation.
new "## Der Rahmen, der als Teil des Bestätigungsbildschirms verwendet wird."
# 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."
# Automatic translation.
new "## Der Rahmen, der als Teil des Überspringungsbildschirms verwendet wird."
# 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."
# Automatic translation.
new "## Der Rahmen, der als Teil des Benachrichtigungsbildschirms verwendet wird."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Should frame backgrounds be tiled?"
# Automatic translation.
new "## Sollen Rahmenhintergründe gekachelt werden?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Bars, Scrollbars, and Sliders"
# Automatic translation.
new "## Balken, Bildlaufleisten und Schieberegler"
# 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."
# Automatic translation.
new "## Diese steuern das Aussehen und die Größe von Balken, Bildlaufleisten und Schiebereglern."
# 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."
# Automatic translation.
new "## Die Standard-GUI verwendet nur Schieberegler und vertikale Bildlaufleisten. Alle anderen Leisten werden nur im vom Ersteller geschriebenen Code verwendet."
# 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."
# Automatic translation.
new "## Die Höhe der horizontalen Balken, Bildlaufleisten und Schieberegler. Die Breite der vertikalen Balken, Rollbalken und Schieberegler."
# 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."
# Automatic translation.
new "## True, wenn die Balkenbilder gekachelt werden sollen. False, wenn sie linear skaliert werden sollen."
# gui.rpy:316
old "## Horizontal borders."
new "## Horizontal borders."
# Automatic translation.
new "## Horizontale Grenzen."
# gui.rpy:321
old "## Vertical borders."
new "## Vertical borders."
# Automatic translation.
new "## Vertikale Ränder."
# 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."
# Automatic translation.
new "## Was man mit nicht scrollbaren Bildlaufleisten in der Benutzeroberfläche macht. \"hide\" blendet sie aus, während \"None\" sie anzeigt."
# gui.rpy:331
old "## History"
new "## History"
# Automatic translation.
new "## Geschichte"
# 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."
# Automatic translation.
new "## Der Verlaufsbildschirm zeigt Dialoge an, die der Spieler bereits verworfen hat."
# 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."
# Automatic translation.
new "## Die Anzahl der Blöcke des Dialogverlaufs, die Ren'Py behält."
# 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 tomake the height variable at the cost of performance."
# Automatic translation.
new "## Die Höhe eines Eintrags im Verlaufsbildschirm, oder None, um die Höhe auf Kosten der Leistung variabel zu machen."
# 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."
# Automatic translation.
new "## Die Position, Breite und Ausrichtung der Beschriftung, die den Namen des sprechenden Zeichens angibt."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## The position, width, and alignment of the dialogue text."
# Automatic translation.
new "## Die Position, Breite und Ausrichtung des Dialogtextes."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Mode"
# Automatic translation.
new "## NVL-Modus"
# 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."
# Automatic translation.
new "## Der NVL-Modus-Bildschirm zeigt den Dialog an, der von den Charakteren im NVL-Modus gesprochen wird."
# 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."
# Automatic translation.
new "## Die Grenzen des Hintergrunds des Hintergrundfensters im NVL-Modus."
# 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."
# Automatic translation.
new "## Die Höhe eines Eintrags im NVL-Modus. Setzen Sie dies auf None, um die Höhe der Einträge dynamisch anzupassen."
# 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."
# Automatic translation.
new "## Der Abstand zwischen NVL-Mode-Einträgen, wenn gui.nvl_height None ist, und zwischen NVL-Mode-Einträgen und einem NVL-Mode-Menü."
# 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_thought text (the text said by the nvl_narrator character.)"
# Automatic translation.
new "## Die Position, Breite und Ausrichtung des nvl_thought-Textes (der Text, der vom nvl_narrator-Zeichen gesprochen wird)."
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## The position of nvl menu_buttons."
# Automatic translation.
new "## Die Position der nvl menu_buttons."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# Automatic translation.
new "## Dadurch werden die Schnellschaltflächen größer, damit sie auf Tablets und Handys leichter zu erreichen sind."
# 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."
# Automatic translation.
new "## Dies ändert die Größe und die Abstände verschiedener GUI-Elemente, um sicherzustellen, dass sie auf Handys gut sichtbar sind."
# gui.rpy:413
old "## Font sizes."
new "## Font sizes."
# Automatic translation.
new "## Schriftgrößen."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Adjust the location of the textbox."
# Automatic translation.
new "## Passen Sie die Position des Textfeldes an."
# 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."
# Automatic translation.
new "## Ändern Sie die Größe und die Abstände der Elemente im Spielmenü."
# gui.rpy:436
old "## File button layout."
new "## File button layout."
# Automatic translation.
new "## Layout der Schaltfläche Datei."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-mode."
# Automatic translation.
new "## NVL-Modus."
# gui.rpy:456
old "## Quick buttons."
new "## Quick buttons."
translate german strings:
# gui/game/gui.rpy:5
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
# Automatic translation.
new "## Die Anweisung init offset bewirkt, dass die Initialisierungsanweisungen in dieser Datei vor den init-Anweisungen in allen anderen Dateien ausgeführt werden."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
# Automatic translation.
new "## Prüfungen auf ungültige oder instabile Eigenschaften in Bildschirmen oder Transformationen aktivieren"
# gui/game/gui.rpy:19
old "## GUI Configuration Variables"
# Automatic translation.
new "## GUI-Konfigurationsvariablen"
# gui/game/gui.rpy:167
old "## The color of button text in various states."
# Automatic translation.
new "## Die Farbe des Schaltflächentextes in verschiedenen Zuständen."
# gui/game/gui.rpy:173
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
# Automatic translation.
new "## Die horizontale Ausrichtung des Schaltflächentextes. (0.0 ist links, 0.5 ist mittig, 1.0 ist rechts)."
# gui/game/gui.rpy:278
old "## The position of the main menu text."
# Automatic translation.
new "## Die Position des Hauptmenütextes."
# gui/game/gui.rpy:287
old "## Generic frames."
# Automatic translation.
new "## Allgemeine Rahmen."
# gui/game/gui.rpy:307
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
# Automatic translation.
new "## Die Standard-GUI verwendet nur Schieberegler und vertikale Bildlaufleisten. Alle anderen Leisten werden nur in vom Ersteller geschriebenen Bildschirmen verwendet."
# gui/game/gui.rpy:368
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
# Automatic translation.
new "## Die maximale Anzahl der Einträge im NVL-Modus, die Ren'Py anzeigt. Wenn mehr Einträge als diese Zahl angezeigt werden sollen, wird der älteste Eintrag entfernt."
# gui/game/gui.rpy:405
old "## Localization"
# Automatic translation.
new "## Lokalisierung"
# gui/game/gui.rpy:407
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# Automatic translation.
new "## Dies steuert, wo ein Zeilenumbruch zulässig ist. Der Standardwert ist für die meisten Sprachen geeignet. Eine Liste der verfügbaren Werte finden Sie unter https://www.renpy.org/doc/html/style_properties.html#style-property-language."
# gui/game/gui.rpy:415
old "## Mobile devices"
# Automatic translation.
new "## Mobile Geräte"
# gui/game/gui.rpy:446
old "## Change the size and spacing of various things."
# Automatic translation.
new "## Ändern Sie die Größe und die Abstände verschiedener Dinge."
Some files were not shown because too many files have changed in this diff
Show More
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.