Compare commits

...

213 Commits

Author SHA1 Message Date
Tom Rothamel 8f0c7df619 Start the 7.2 series. 2018-10-11 17:06:39 -04:00
Tom Rothamel 41e9f86d1d Update sponsors list. 2018-10-10 00:16:46 -04:00
Tom Rothamel f3bee22ae7 Changelog last. 2018-10-08 23:02:22 -04:00
Tom Rothamel 0923ca9880 SetVariable and ToggleVariable now take fields along with variables. 2018-10-08 20:05:34 -04:00
Tom Rothamel abef9ac3f9 Automatically determine the version number to use. 2018-10-06 12:55:20 -04:00
Tom Rothamel 966adf6821 Distribute checks that checksums.txt exists, refuses to run if so. 2018-10-06 11:49:15 -04:00
Tom Rothamel 99d8a021c6 Changelog. 2018-10-06 08:32:55 -04:00
Tom Rothamel 6f379ca291 Add the new string to Android. 2018-10-06 08:20:15 -04:00
Tom Rothamel 326f8532f6 distribute: Sign by default. 2018-10-03 22:54:40 -04:00
Tom Rothamel 63a9c3943c Fix typos in changelog. 2018-10-03 22:50:08 -04:00
Tom Rothamel 8bf108be2e Update incompatible. 2018-10-02 21:11:53 -04:00
Tom Rothamel 20fa4cb41d New icon background for the_question. 2018-10-01 22:43:33 -04:00
Tom Rothamel 16c9e776b2 Fix the sense of the version test. 2018-10-01 22:42:06 -04:00
Tom Rothamel 866ee50498 Chain translates even if a module isn't loaded.
Fixes #1569.
2018-09-30 14:49:01 -04:00
Tom Rothamel 018887163f Update changelog. 2018-09-29 02:56:30 -04:00
Tom Rothamel 0ad2f6b847 Store the locations of displaybales in text.
Fixes #1582.
2018-09-28 23:23:08 -04:00
Tom Rothamel a5222719b0 window auto treats menu-with-caption differently. 2018-09-27 10:31:04 -04:00
Tom Rothamel d1f5ab37d9 Give menu-with-caption a different statement name.
This then lets us treat it differently for the purpose of window
auto.
2018-09-27 10:29:00 -04:00
Tom Rothamel 5c0ab50d22 Place displayables-in-text on every frame.
Fixes #1573.
2018-09-26 23:01:54 -04:00
Tom Rothamel f2a824e2ef Changelog android. 2018-09-26 01:36:19 -04:00
Tom Rothamel 7e30c7ee0a Restart the interaction after taking a screenshot.
Fixes #1581.
2018-09-25 02:23:34 -04:00
Tom Rothamel 31e85a14c2 Dcoument the history fix. 2018-09-24 21:27:05 -04:00
Tom Rothamel a9dfb15d14 Set motion.null properly.
Fixes #1578. This is used to transfer an animation if no frame would
otherwise have been shown - a rare case.
2018-09-23 23:45:59 -04:00
Tom Rothamel a1f0fbaa19 Give the tutorial a valid version number.
Fixes #1580. Fixes #1579.
2018-09-23 16:38:06 -04:00
Tom Rothamel 52083b2be9 Handle zero-width characters in Ren'Py for image fonts. 2018-09-22 13:33:07 -04:00
Tom Rothamel 40d481b72f Handle all of the zero-width characters in Ren'Py's freetype support. 2018-09-22 13:24:10 -04:00
Tom Rothamel 6985e14737 Make menus respect window show/hide/auto.
This addresses #1576, by keeping the window up all the time, as
it should have been.
2018-09-22 01:28:09 -04:00
Tom Rothamel 5e567f040b Do not substitute history text.
It has already been substituted, so we don't want to do it again.

Fixes #1575. Fixes #1516.
2018-09-21 01:02:21 -04:00
Tom Rothamel 6a1873be1a Expose the substitute property for label. 2018-09-20 22:45:06 -04:00
Tom Rothamel 8add50b930 Merge pull request #1568 from lee-yunseok/master
Fix a little bit in Korean comments.
2018-09-19 16:33:03 -05:00
Tom Rothamel a9c4b72bb0 Wrap error handling writes to stdout in exception handling.
At least one computer has been having problems with stdout on
windows, so we want to error handle this.
2018-09-18 20:53:52 -04:00
Tom Rothamel e52eb6fead Fix doc typo. 2018-09-18 20:44:16 -04:00
Tom Rothamel 01b37552f6 Translate the current update status. 2018-09-18 20:39:58 -04:00
Tom Rothamel ea31af9bc2 Remove russian obsolete.rpy.
It duplicates translations found in other files - something went
wrong with #1570.
2018-09-18 20:35:46 -04:00
Tom Rothamel e5a3cff41e Merge pull request #1570 from Ria-kon/master
Russian update 7.1.0
2018-09-17 16:12:27 -05:00
Ria-kon 70881c90a4 Russian update 7.0.1. 2018-09-16 23:01:01 +03:00
Tom Rothamel 607a1acc00 Add nestled-close as an option for ctc_position. 2018-09-16 12:22:14 -04:00
Tom Rothamel 53ffeed805 Allow multiple segments to be passed to CTC, internally. 2018-09-16 12:12:00 -04:00
Tom Rothamel 0ae0bf4c0d Handle the CB (contingient break) breaking class.
This is used by displayables embedded in text. The unicode standard
allows us to handle this however we want, so we break unless there
is a non-breaking-space before or after the CB. (including ZWNBSP).
2018-09-15 23:42:07 -04:00
Tom Rothamel 8f40cf2da5 Use U+FFFC to represent displayables in text.
This is the OBJECT REPLACEMENT CHARACTER, which is useful because
it creates a character of breaking class CB, which allows Ren'Py
to decide if it wants to put a break before or after the object.
2018-09-15 23:39:01 -04:00
Tom Rothamel 08dba61bd9 Add alternate click to Drag.
This seems like it would make sense for things like a Minecraft-like
crafting system.

Fixes #1567.
2018-09-14 23:17:11 -04:00
Lee Yunseok 41fce3426d Merge pull request #5 from renpy/master
Keep going to latest.
2018-09-15 08:43:53 +09:00
Lee Yunseok 057ea1ea2c Fix some comments. 2018-09-15 08:42:11 +09:00
Tom Rothamel 8baaa7654f Changelog 7.1.1. 2018-09-13 21:11:09 -04:00
Tom Rothamel 14bf26efd6 Voice fixes.
* Always compute and use the tlid.
* Handle the sustain preference before an interaction, rather
  than after it.

Fixes #1566.
2018-09-13 00:09:38 -04:00
Tom Rothamel 8ad281048b Bump version. 2018-09-12 01:21:29 -04:00
Tom Rothamel 1b169672ba Add fribidi-src to the source archive.
This should address #1562, though I'll check for the nightly to
see that the build completed.
2018-09-11 18:34:25 -04:00
Tom Rothamel 4b4c3b73a3 Do not use ruby top text when computing typewriter blits. 2018-09-10 19:40:49 -04:00
Tom Rothamel 9270013b9a Fix the combination of ART and Knuth-Plass. 2018-09-09 21:38:30 -04:00
Tom Rothamel 0f618bc54f Log the Ren'Py version in android.txt. 2018-09-08 11:45:37 -04:00
Tom Rothamel 06979f6ade sl2: Give vpgrid its transpose property. 2018-09-08 11:19:22 -04:00
Tom Rothamel b4ff687efe Fix parsing of r at the end of a line. 2018-09-07 23:37:12 -04:00
Tom Rothamel 5c5408a490 Sponsors and keywords. 2018-09-07 10:03:30 -04:00
Tom Rothamel 492cacca02 Add the activated property to Drag.
This lets a function run when the user clicks on the drag.
2018-09-07 00:53:59 -04:00
Tom Rothamel 1fabbf4976 Credits and changelog. 2018-09-06 00:22:59 -04:00
Tom Rothamel 87bf27a7bb Mark prototype/gradlew as executable. 2018-09-05 01:31:51 -04:00
Tom Rothamel 1af96ca83c After applying retain_after_load, keep the flag set.
Fixes #1527.
2018-09-05 01:08:33 -04:00
Tom Rothamel 41f1124052 Remove Context.translate_block_language.
Which was never used. Fixes #1554.
2018-09-04 20:55:35 -04:00
Lee Yunseok cd33c95cc9 Merge pull request #4 from renpy/master
Keep going with latest.
2018-09-05 03:40:19 +09:00
Tom Rothamel c5adab69df Merge pull request #1552 from lee-yunseok/master
Update Korean translations.
2018-09-03 23:26:58 -05:00
Tom Rothamel ce980ddb2c li: Ensure that an attribute is only chosen once.
A bug was causing choose_attribute to return the same attribute
more than once, which prevents the rest of Ren'Py from selecting
the image.

Fixes #1514.
2018-09-03 15:42:52 -04:00
Tom Rothamel 09b25592b6 Retain attributes on an exact match of a layeredimage.
This now checkes the image, instead of the tag, for a
_choose_attributes method. If one exists, an exact match
is ignored, and attributes are retained.

Fixes #1517.
2018-09-03 15:30:14 -04:00
Tom Rothamel d78d035402 Merge pull request #1535 from bvtsang/typofix
to used the same -> to use the same
2018-09-03 10:05:38 -05:00
Tom Rothamel 79fe07c44b Merge pull request #1558 from Andykl/FixInteract
Prevent doing unused computing
2018-09-03 10:04:12 -05:00
Andy_kl 91f69320fc Prevent doing unused computing 2018-09-03 17:58:10 +03:00
Andykl 56eeec5b94 Merge pull request #2 from renpy/master
!
2018-09-03 17:44:26 +03:00
Tom Rothamel 22a9900fad Fix raw strings.
This was broken by image attribytes, where r'' would have  the r
parsed as an image attribute.
2018-09-02 22:10:59 -04:00
Tom Rothamel 282676a653 Fix with statement.
Fixes #1543.
2018-09-02 11:25:38 -04:00
Tom Rothamel d72bf5e411 Merge pull request #1557 from Andykl/Transition-fix
Transition fix
2018-09-02 10:17:43 -05:00
Andy_kl 83ca8571f0 Fix typo 2018-09-02 18:04:15 +03:00
Andy_kl d42c73389a Fix typo 2018-09-02 17:43:48 +03:00
Andykl 8bb870a5c5 Merge pull request #1 from renpy/master
!
2018-09-02 17:39:04 +03:00
Tom Rothamel 3013bab470 Fix typo. 2018-09-02 10:35:43 -04:00
Tom Rothamel 55d3d1fe40 Update .gitignore. 2018-09-02 10:35:13 -04:00
Tom Rothamel a8f3a64d64 Add back in sphinx/source/keywords.rpy
Fixes #1551.
2018-09-02 09:24:06 -04:00
Tom Rothamel 4d320baaa2 Android proofreading. 2018-09-02 02:12:40 -04:00
Tom Rothamel 9deb0a3759 Changelog say-with-attributes. 2018-09-02 00:47:26 -04:00
Tom Rothamel 8fff014801 Compat last. 2018-09-01 23:15:29 -04:00
Tom Rothamel 98b85feab3 Use the side image to resolve say attributes of an image that isn't shown. 2018-09-01 23:14:08 -04:00
Tom Rothamel fec0c06576 get_side_image uses the tag default layer. 2018-09-01 22:33:53 -04:00
Tom Rothamel 97d5a4a753 Compat last change. 2018-08-31 21:18:54 -04:00
Tom Rothamel 8679023013 Add the ability to reject relative paths. 2018-08-31 21:17:29 -04:00
Lee Yunseok 1e0293e6a0 Merge pull request #3 from renpy/master
Merge from original branch
2018-09-01 08:02:41 +09:00
Lee Yunseok fe32eb3149 Fix missing strings. 2018-08-30 01:52:58 +09:00
Tom Rothamel 01f536fc69 Change to a release build by default. 2018-08-28 22:24:38 -04:00
Lee Yunseok ce9e41f1bf Fix typo. 2018-08-28 00:17:10 +09:00
Tom Rothamel 6390253c45 Add config.context_callback.
A way to call a python function on each new context.
2018-08-26 23:11:07 -04:00
Lee Yunseok 328d176365 Fix typo. 2018-08-27 09:40:55 +09:00
Lee Yunseok fccb1e76cb Fix missing strings. 2018-08-27 09:37:14 +09:00
Lee Yunseok e98e37aec0 Salt. 2018-08-27 09:28:30 +09:00
Lee Yunseok 7001b18315 Update Korean strings. 2018-08-27 09:25:03 +09:00
Lee Yunseok 5a01bccdad Update Korean strings. 2018-08-27 08:50:55 +09:00
Lee Yunseok f42aa482f3 Update Korean strings. 2018-08-27 08:16:59 +09:00
Lee Yunseok 48708bf46b Fix typo. 2018-08-27 07:21:34 +09:00
Lee Yunseok 348b9c33be Fix typo. 2018-08-27 07:21:10 +09:00
Lee Yunseok 298595ac8e Fix typo. 2018-08-27 07:20:47 +09:00
Lee Yunseok 7dbe133be8 Fix typo. 2018-08-27 07:20:26 +09:00
Lee Yunseok 4912e024c6 Fix typo. 2018-08-27 07:19:56 +09:00
Lee Yunseok 2505e07ab0 Fix typo. 2018-08-27 07:19:25 +09:00
Lee Yunseok 982acd905a Fix typo. 2018-08-27 07:19:04 +09:00
Lee Yunseok 3baa13fc88 Fix typo. 2018-08-27 07:18:33 +09:00
Lee Yunseok 871abf17d7 Fix typo. 2018-08-27 07:18:01 +09:00
Lee Yunseok 72fb8332e5 Fix typo. 2018-08-27 07:17:39 +09:00
Lee Yunseok 30662cda80 Fix typo. 2018-08-27 07:17:12 +09:00
Lee Yunseok e5f5ce0352 Fix typo. 2018-08-27 07:16:47 +09:00
Lee Yunseok a1325997af Fix typo. 2018-08-27 07:16:06 +09:00
Lee Yunseok 96a92e7894 Fix typo. 2018-08-27 07:15:39 +09:00
Lee Yunseok 532fae9cf1 Fix typo. 2018-08-27 07:15:10 +09:00
Lee Yunseok b65965869c Fix typo. 2018-08-27 07:13:55 +09:00
Lee Yunseok 0498b77b72 Fix typo. 2018-08-27 07:13:17 +09:00
Lee Yunseok 93c4da4259 Update Korean Strings. 2018-08-27 05:54:07 +09:00
Lee Yunseok 037ce66e1c Merge pull request #2 from renpy/master
latest
2018-08-27 05:41:54 +09:00
Tom Rothamel 5dd5b3b4eb Update translations. 2018-08-26 00:44:53 -04:00
Tom Rothamel 67872949f1 Run python code before initiing system styles.
This lets the python code change the system styles.
2018-08-26 00:44:24 -04:00
Tom Rothamel 54999085ad Report translation errors. 2018-08-26 00:38:11 -04:00
Tom Rothamel bc2065041f Fix Korean translation. 2018-08-26 00:35:28 -04:00
Tom Rothamel 8321cd4a7f Update the android translations. 2018-08-25 20:33:19 -04:00
Lee Yunseok 32f295d33a Merge pull request #1 from renpy/master
d
2018-08-26 08:24:04 +09:00
Tom Rothamel e5f6d76726 Merge pull request #1550 from sbrn10/master
Update Korean translations for Ren'py 7
2018-08-23 01:01:30 -05:00
philat 619485cd5f Merge pull request #1 from sbrn10/sbrn10-patch-1
Update Korean translations for Ren'py 7
2018-08-23 14:49:33 +09:00
philat 27a20774ae Update screens.rpy 2018-08-23 14:44:47 +09:00
philat bd77fad010 Update common.rpy 2018-08-23 14:44:20 +09:00
philat a3e09f09a0 Update Korean translations for Ren'py 7 2018-08-23 14:40:01 +09:00
philat b3e1022338 Update screens.rpy 2018-08-23 14:31:55 +09:00
Tom Rothamel 93c87209f7 Fix Motion.
It has broken at some point in the past, probably back when None
stopped being a value for xanchor and yanchor.
2018-08-21 21:47:34 -04:00
Tom Rothamel 4f01e83fb9 Merge branch 'master' of github.com:renpy/renpy 2018-08-20 10:33:23 -04:00
Tom Rothamel bbe63fb04f Allow TextButton to take text_ prefixed properties. 2018-08-20 09:29:33 -05:00
Tom Rothamel 10a6c01e6a Merge pull request #1540 from jsfehler/expose_buttons
Expose ImageButton and TextButton displayables
2018-08-19 08:36:14 -05:00
Tom Rothamel 42619ec25c Merge pull request #1542 from lee-yunseok/patch-1
Update translating_renpy.rst
2018-08-19 08:35:31 -05:00
Tom Rothamel 0d780e24d7 Mark gradlew as executable. 2018-08-17 09:49:23 -05:00
Tom Rothamel 154cde899e Use ** when adding in kwargs. 2018-08-16 21:21:29 -05:00
Tom Rothamel 9272f013b6 Include arguments when generating say translations.
Fixes #1541.
2018-08-16 20:26:37 -05:00
Tom Rothamel ffbe29151b Update the changelog. 2018-08-15 23:38:40 -04:00
Tom Rothamel 88abd4a30a Don't tag python-for-android.
Which we stopped using awhile back.
2018-08-15 21:51:50 -04:00
Tom Rothamel 689e680258 Change the name of 7.1 2018-08-15 21:39:55 -04:00
Tom Rothamel 95b5cf4da8 Check in the changelog. 2018-08-15 21:10:56 -04:00
Tom Rothamel e61c798146 Changelog android. 2018-08-15 01:34:18 -04:00
Tom Rothamel a2b8da104b Update android documentation. 2018-08-14 22:35:48 -04:00
Lee Yunseok cf35745027 Update translating_renpy.rst
Just Ren'PY to Ren'Py.
2018-08-14 15:31:17 +09:00
Tom Rothamel d45ae50925 Allow spacing to be adjusted in a single direction.
Fixes #1525.
2018-08-14 00:32:43 -04:00
Joshua Fehler 9f750d8706 Expose ImageButton and TextButton displayables 2018-08-13 19:34:55 -04:00
Tom Rothamel a674fa2a10 Bump the version and update keywords. 2018-08-13 00:08:48 -04:00
Tom Rothamel 76f9ed2ac0 Update pig latin translation. 2018-08-12 19:48:38 -04:00
Tom Rothamel 7e27fbf968 Support for translating Android. 2018-08-12 19:45:45 -04:00
Tom Rothamel 712e0f00f9 Clarify JDK 8 is needed. 2018-08-12 08:53:05 -04:00
Tom Rothamel fcebe42b31 Use ca certificates when downloading android. 2018-08-12 08:52:00 -04:00
Tom Rothamel d845c7b357 Avoid saving on suspend while at the main menu. 2018-08-09 23:04:46 -04:00
Bryan Tsang 262694e6aa to used the same -> to use the same 2018-08-08 22:59:15 -07:00
Tom Rothamel d829d14393 Allow substitution in LayeredImageProxy. 2018-08-09 01:40:53 -04:00
Tom Rothamel 6fe1487ac2 Fix documentation for speaking attribute. 2018-08-08 23:01:22 -04:00
Tom Rothamel 9e3149b984 id: Make scanning for blacklisted image tags an O(n) operation.
Since O(n**2) is bad.
2018-08-07 09:48:06 -04:00
Tom Rothamel 08ac3e484b Document box_wrap_spacing. 2018-08-07 08:33:24 -04:00
Tom Rothamel 3c2054e3b2 Merge pull request #1522 from Andykl/Box-wrap_spacing
Added new box_wrap_spacing style property
2018-08-06 07:31:01 -04:00
Tom Rothamel d438b764d6 Change the android params. 2018-08-04 22:54:35 -04:00
Tom Rothamel d2550f31d7 Pass parameters through an ImageReference. 2018-08-03 09:53:18 -04:00
Tom Rothamel 226fb7ded0 Update RAPT. 2018-08-03 01:17:22 -04:00
Tom Rothamel e820270f5d Remove the target version question. 2018-08-01 22:16:31 -04:00
Tom Rothamel 8f5046a5a9 New regexps for android-specific icons. 2018-07-26 23:48:24 -04:00
Tom Rothamel eba56d7fb2 Change the android icons for The Question. 2018-07-26 23:44:06 -04:00
Tom Rothamel 39e76d7249 Merge pull request #1520 from AXYPB/master
Typo corrections in documentation
2018-07-25 16:33:05 -04:00
Craig Donson 6ba17709fd Typo correction in Displayables documentation 2018-07-25 10:27:33 -04:00
Craig Donson 223e7b6cf0 Typo corrections in docstrings 2018-07-25 10:27:09 -04:00
Tom Rothamel a687b678f5 Merge pull request #1524 from Saltome/patch-1
game_menu() no longer ignores screen parameter.
2018-07-24 17:07:19 -04:00
Saltome 659cd40846 game_menu() no longer ignores screen parameter.
The screen argument needs to be passed as a keyword.
2018-07-24 22:44:32 +02:00
Craig Donson dbd7cc05dd Escape @ symbols in font indexes 2018-07-23 23:39:50 -04:00
Craig Donson ce14610ec2 Typo corrections 2018-07-23 18:39:29 -04:00
Tom Rothamel bae6f8551d Document the language_tailor function. 2018-07-21 22:06:43 -04:00
Andy_kl d368c98744 Added new box_wrap_spacing style property 2018-07-21 07:28:59 +05:00
Craig Donson 27dab57802 Typo corrections 2018-07-19 11:40:52 -04:00
Tom Rothamel e73c81ccc6 Merge pull request #1513 from AXYPB/master
Typo corrections in documentation
2018-07-15 15:02:24 -04:00
Craig Donson 90d1edb3c9 Typo corrections 2018-07-15 11:56:03 -04:00
Craig Donson 8f5231ff81 Correct capitalization of "Python" 2018-07-15 11:55:55 -04:00
Tom Rothamel abe4b61f79 Merge pull request #1512 from Moshibit/master
Fix typo
2018-07-14 09:24:20 -04:00
Tom Rothamel 6e649e3548 Merge pull request #1511 from AXYPB/master
Typo corrections in documentation
2018-07-13 17:08:58 -04:00
Craig Donson 7e6972f5c4 Correct capitalization of "Python" 2018-07-13 07:14:00 -04:00
Craig Donson fdc0cef96b Typo corrections in documentation 2018-07-13 04:14:56 -04:00
Moshibit 9213472a67 Merge pull request #1 from Moshibit/Moshibit-patch-1
Update gui.rpy
2018-07-12 23:41:00 -05:00
Moshibit f122fa4b8b Update gui.rpy
fix typo
2018-07-12 23:36:34 -05:00
Tom Rothamel db2e8038e2 Update the piglatin translation. 2018-07-12 22:17:28 -04:00
Tom Rothamel 8aa234c790 Update the credits and changelog. 2018-07-12 21:40:24 -04:00
Tom Rothamel 36f4bb2048 Update sponsor list. 2018-07-11 23:37:07 -04:00
Tom Rothamel c9ffdaf1f2 Remove fribidi charset conversions.
As we don't use them.
2018-07-11 00:49:32 -04:00
Tom Rothamel fe9af97b34 Convert directly from Python's unicode to Fribidi's unicode.
This prevents a security flaw in the fribidi charset conversion
code.

Fixes #1509.
2018-07-11 00:17:48 -04:00
Tom Rothamel 4a9efc0cab Include a private copy of fribidi.
The non-glib version has been unmainted outside of Ren'Py,
but it's a much better version for us to use. So instead,
cut it down and include it.
2018-07-10 19:17:20 -04:00
Tom Rothamel 4185bbd0b3 Use an unverified SSL context to pull the list of channels.
This fixes the updater, when run under renpython.
2018-07-09 22:04:25 -04:00
Tom Rothamel 05f91a70d2 Update comment. 2018-07-08 22:56:44 -04:00
Tom Rothamel 58e8413e79 Merge pull request #1506 from AXYPB/master
Typo corrections in documentation
2018-07-08 22:16:05 -04:00
Craig Donson 498dfd5cbb Typo corrections in documentation 2018-07-08 20:23:09 -04:00
Tom Rothamel 99cd6a3b91 Merge pull request #1504 from Beuc/patch-2
render: typos in docstring
2018-07-08 18:12:17 -04:00
Sylvain Beucler a74578635b render: typos in docstring 2018-07-08 12:37:51 +02:00
Tom Rothamel b36dd59710 Include dependencies for requests.
(But not requests itself.)
2018-07-06 18:07:37 -04:00
Tom Rothamel 2f7c9328ad Changelog. 2018-07-06 02:38:28 -04:00
Tom Rothamel 8ed3b8e009 Do not post a TIMEVENT when a TIMEEVENT is ignored.
Ignoring a TIMEEVENT is reasonable to do - it makes sense for a
modal to be able to cancel out things like a pause. Such ignoring
should not post a second TIMEEVENT, as that trigers constant
processing of TIMEEEVENTS.

Fixes #1502.
2018-07-05 19:45:45 -04:00
Tom Rothamel 7a613e6b7b Use os.pathsep to split RENPY_DEPS_INSTALL.
(If :: is not given.)

Fixes #1499.
2018-07-04 12:44:58 -04:00
Tom Rothamel 9f16b1457e Fix the optimization of visit_all. 2018-07-03 22:23:27 -04:00
Tom Rothamel ba5951eddd Revert "Only visit children once in visit_all."
This reverts commit 160b2eb1f6.
2018-07-03 22:15:17 -04:00
Tom Rothamel 32d0153dc7 Fix problems with renpy.log during startup.
Fixes #1491 in a slightly different way.
2018-07-03 20:15:06 -04:00
Tom Rothamel 160b2eb1f6 Only visit children once in visit_all. 2018-07-03 10:53:36 -04:00
Tom Rothamel e7e2f4a505 Call per_interact on syle children of Window, Bar, and Frame.
This lets DynamicDisplayables be used here (and in ImageButtons, etc),
while ensuring the DD updates properly.
2018-07-03 10:53:36 -04:00
Tom Rothamel 9ce4be18be Merge pull request #1492 from AXYPB/master
Documentation corrections
2018-07-02 17:11:30 -04:00
Craig Donson 4bcec62df0 Typo correction 2018-07-02 16:57:36 -04:00
Tom Rothamel 68f1f37064 Fix typo. 2018-07-01 23:11:31 -04:00
Tom Rothamel ce8a034d6d Expose renpy.translate_string.
This allows Ren'Py to translate a string into a foreign language,
without changing the language as whole.
2018-07-01 21:00:36 -04:00
Tom Rothamel 6d38f66fc7 Apply pngcrush to launcher images. 2018-07-01 09:51:09 -04:00
Tom Rothamel 1dede9828f Fix documentation. 2018-07-01 09:51:09 -04:00
Tom Rothamel 59f276dac0 Update credits. 2018-07-01 09:51:09 -04:00
Tom Rothamel e877db4b48 Merge pull request #1494 from MuhdNurHidayat/malay-in-latin-script-translation
Add Malay translation (part 1)
2018-07-01 09:37:01 -04:00
Muhammad Nur Hidayat Yasuyoshi (MNH48.com) 3455b1a78b Add Malay 2018-07-01 01:10:56 +08:00
Muhammad Nur Hidayat Yasuyoshi (MNH48.com) 4bc6cb9a84 Add Malay translation for Launcher (#2)
* Created directory for Malay language
* Translated all files to Malay language
2018-06-30 20:48:54 +08:00
Muhammad Nur Hidayat Yasuyoshi (MNH48.com) 60c6555d7e Add Malay translation for The Question (#1)
* Created directory for Malay
* Translated the files to Malay
* Added Malay into the screen menu
2018-06-30 20:33:33 +08:00
Craig Donson bca06bf124 Typo corrections 2018-06-29 22:40:56 -04:00
Tom Rothamel 21fabf6c06 Check in sponsors doc. 2018-06-29 19:32:40 -04:00
Tom Rothamel 849b9e677b Update changelog. 2018-06-28 23:33:50 -04:00
204 changed files with 30446 additions and 1697 deletions
-1
View File
@@ -79,7 +79,6 @@ renpy/vc_version.py
doc-web
sphinx/source/inc
sphinx/source/keywords.py
sphinx/source/thequestion.rst
tutorial/game/tutorial_director.rpy
launcher/theme
+4 -3
View File
@@ -76,10 +76,11 @@ Then, install pygame_sdl2 by running the following commands::
python setup.py install_headers
popd
Next, set RENPY_DEPS_INSTALL To a \::-separated list of paths containing the
dependencies, and RENPY_CYTHON to the name of the cython command::
Next, set RENPY_DEPS_INSTALL To a \:-separated (\;-separated on Windows)
list of paths containing the dependencies, and RENPY_CYTHON to the name
of the cython command::
export RENPY_DEPS_INSTALL="/usr::/usr/lib/x86_64-linux-gnu/"
export RENPY_DEPS_INSTALL="/usr:/usr/lib/x86_64-linux-gnu/"
export RENPY_CYTHON=cython
Finally, use setup.py in the Ren'Py ``module`` directory to compile and
+14
View File
@@ -19,3 +19,17 @@ Translation to the Russian language. Most of translation provided by Project
Gardares, especially Ria-kon.
* Project Gardares <guardares@gmail.com>
Malay
---------
Translation to the Malay language. This will be translated to both writing
systems used in Malay, namely the Latin-based Rumi script system and the
Arabic-based Jawi script system, to provide compatibility in some areas where
there is still exist Malay people who still cannot read their language in the
newer Rumi script system, or refused to use it. The translation is being made
as general and native as possible to cover the entire region that uses Malay
language, this means native words take precedence over loanwords if and only if
both native and loanwords exist and both are suitable in the context of use.
* Muhammad Nur Hidayat (MNH48) <translation@mnh48.moe>
-1
View File
@@ -11,7 +11,6 @@ from renpy import version_tuple # @UnresolvedImport
SOURCE = [
"/home/tom/ab/renpy",
"/home/tom/ab/android/",
"/home/tom/ab/android/python-for-android",
"/home/tom/ab/ripe/renios",
"/home/tom/ab/renpy-deps",
"/home/tom/ab/pygame_sdl2",
+9 -2
View File
@@ -47,12 +47,13 @@ def main():
raise Exception("Not running with python optimization.")
ap = argparse.ArgumentParser()
ap.add_argument("version")
ap.add_argument("version", nargs="?")
ap.add_argument("--fast", action="store_true")
ap.add_argument("--pygame", action="store", default=None)
ap.add_argument("--no-rapt", action="store_true")
ap.add_argument("--variant", action="store")
ap.add_argument("--sign", action="store_true")
ap.add_argument("--sign", action="store_true", default=True)
ap.add_argument("--nosign", action="store_false", dest="sign")
args = ap.parse_args()
@@ -66,6 +67,9 @@ def main():
# file has changed, bump it by 1.
import renpy
if args.version is None:
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1]) # @UndefinedVariable
match_version = ".".join(str(i) for i in renpy.version_tuple[:2]) # @UndefinedVariable
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", "--match", "start-" + match_version ])
@@ -103,6 +107,9 @@ def main():
if args.variant:
destination += "-" + args.variant
if os.path.exists(os.path.join(destination, "checksums.txt")):
raise Exception("The checksums.txt file exists.")
print("Version {} ({})".format(args.version, full_version))
# Perhaps autobuild.
+1 -1
View File
@@ -122,7 +122,7 @@ define gui.namebox_height = None
define gui.namebox_borders = Borders(5, 5, 5, 5)
## If True, the background of the namebox will be tiled, if False, the background
## if the namebox will be scaled.
## of the namebox will be scaled.
define gui.namebox_tile = False
+3 -1
View File
@@ -904,13 +904,15 @@ screen history():
label h.who:
style "history_name"
substitute False
## Take the color of the who text from the Character, if set.
if "color" in h.who_args:
text_color h.who_args["color"]
$ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags)
text what
text what:
substitute False
if not _history_list:
label _("The dialogue history is empty.")
+31 -74
View File
@@ -28,7 +28,7 @@ init python:
ANDROID_OK = 5
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 = _("An x86 Java 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 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_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_CONFIG_TEXT = _("The current project has not been configured. Use \"Configure\" to configure it before building.")
@@ -45,10 +45,11 @@ init python:
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.")
CONNECT_TEXT = _("Connects to an Android device running ADB in TCP/IP mode.")
DISCONNECT_TEXT = _("Disconnects from an Android device running ADB in TCP/IP mode.")
LOGCAT_TEXT = _("Retrieves the log from the Android device and writes it to a file.")
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.")
import subprocess
import re
@@ -83,6 +84,8 @@ init python:
import rapt.interface
rapt.plat.renpy = True
rapt.plat.translate = __
else:
rapt = None
@@ -95,11 +98,9 @@ init python:
return ANDROID_NO_RAPT
if renpy.windows and not "JAVA_HOME" in os.environ:
return ANDROID_NO_JDK
if not os.path.exists(rapt.plat.path("android-sdk/platforms/" + rapt.plat.target)):
if not os.path.exists(rapt.plat.adb):
return ANDROID_NO_SDK
if not os.path.exists(rapt.plat.path("android.keystore")):
return ANDROID_NO_KEY
if not os.path.exists(rapt.plat.path("local.properties")):
if not os.path.exists(rapt.plat.path("project/local.properties")):
return ANDROID_NO_KEY
if not os.path.exists(os.path.join(project.current.path, ".android.json")):
return ANDROID_NO_CONFIG
@@ -268,6 +269,10 @@ init python:
rapt.build.build(rapt_interface, dist, command, launch=launch, finished=finished)
def android_build_argument(cmd):
return cmd + project.current.data["android_build"]
# The android support can stick unicode into os.environ. Fix that.
init 100 python:
@@ -362,6 +367,20 @@ screen android:
has vbox
hbox:
spacing 15
textbutton _("Debug"):
action SetDict(project.current.data, "android_build", "Debug")
hovered tt.Action(DEBUG_TEXT)
textbutton _("Release"):
action SetDict(project.current.data, "android_build", "Release")
hovered tt.Action(RELEASE_TEXT)
add HALF_SPACER
textbutton _("Install SDK & Create Keys"):
action AndroidIfState(state, ANDROID_NO_SDK, Jump("android_installsdk"))
hovered tt.Action(INSTALL_SDK_TEXT)
@@ -397,14 +416,6 @@ screen android:
has vbox
textbutton _("Remote ADB Connect"):
action AndroidIfState(state, ANDROID_OK, Jump("android_connect"))
hovered tt.Action(CONNECT_TEXT)
textbutton _("Remote ADB Disconnect"):
action AndroidIfState(state, ANDROID_OK, Jump("android_disconnect"))
hovered tt.Action(DISCONNECT_TEXT)
textbutton _("Logcat"):
action AndroidIfState(state, ANDROID_NO_KEY, Jump("logcat"))
hovered tt.Action(LOGCAT_TEXT)
@@ -469,74 +480,20 @@ label android_configure:
label android_build:
$ android_build([ 'release' ], opendir=True)
$ android_build([ android_build_argument("assemble") ], opendir=True)
jump android
label android_build_and_install:
$ android_build([ 'release', 'install' ])
$ android_build([ android_build_argument("install") ])
jump android
label android_build_install_and_launch:
$ android_build([ 'release', 'install' ], launch=True)
jump android
label android_connect:
python hide:
if persistent.connect_address is not None:
address = persistent.connect_address
else:
address = ""
while True:
address = interface.input(
_("Remote ADB Address"),
_("Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."),
default=address,
cancel=Jump("android"),
)
address = address.strip()
try:
host, port = address.split(":")
except:
interface.error(_("Invalid remote ADB address"), _("The address must contain one exactly one ':'."), label=None)
continue
if " " in host:
interface.error(_("Invalid remote ADB address"), _("The host may not contain whitespace."), label=None)
continue
try:
int(port)
except:
interface.error(_("Invalid remote ADB address"), _("The port must be a number."), label=None)
continue
break
persistent.connect_address = address
rapt_interface = MobileInterface("android")
rapt.build.connect(rapt_interface, address)
jump android
label android_disconnect:
python hide:
rapt_interface = MobileInterface("android")
rapt.build.disconnect(rapt_interface)
$ android_build([android_build_argument("install") ], launch=True)
jump android
@@ -556,7 +513,7 @@ init python:
def android_build_command():
ap = renpy.arguments.ArgumentParser()
ap.add_argument("android_project", help="The path to the project directory.")
ap.add_argument("ant_commands", help="Commands to pass to ant. (Try 'release' 'install'.)", nargs='+')
ap.add_argument("gradle_commands", help="Commands to pass to gradle. (Try 'installDebug' or 'assembleRelease'.)", nargs='+')
ap.add_argument("--launch", action="store_true", help="Launches the app after build and install compete.")
ap.add_argument("--destination", "--dest", default=None, action="store", help="The directory where the packaged files should be placed.")
@@ -564,7 +521,7 @@ init python:
p = project.Project(args.android_project)
android_build(args.ant_commands, p=p, gui=False, launch=args.launch, destination=args.destination)
android_build(args.gradle_commands, p=p, gui=False, launch=args.launch, destination=args.destination)
return False
+71
View File
@@ -0,0 +1,71 @@
# This file contains strings used by RAPT, so the Ren'Py translation framework
# can find them. It's automatically generated by rapt/update_translations.py, and
# hence should not be changed by hand.
init python hide:
__("{} is not a directory.")
__("{} does not contain a Ren'Py game.")
__("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.")
__("Launching app.")
__("The build seems to have succeeded.")
__("The armeabi-v7a version works on most phones on tablets, while 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.")
__("The package name may not be empty.")
__("The package name may not contain spaces.")
__("The package name must contain at least one dot.")
__("The package name may not contain two dots in a row, or begin or end with a dot.")
__("Each part of the package name must start with a letter, and contain only letters, numbers, and underscores.")
__("{} is a Java keyword, and can't be used as part of a package name.")
__("What is the application's version?\n\nThis should be the human-readable version that you would present to a person. It must contain only numbers and dots.")
__("The version number must contain only numbers and dots.")
__("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 would you like your application to be displayed?")
__("In landscape orientation.")
__("In portrait orientation.")
__("In the user's preferred orientation.")
__("Which app store would you like to support in-app purchasing through?")
__("Google Play.")
__("Amazon App Store.")
__("Both, in one app.")
__("Neither.")
__("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?")
__("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 variabe 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?")
__("I'm downloading the Android SDK. This might take a while.")
__("I'm extracting the Android SDK.")
__("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 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?")
__("Please enter your name or the name of your organization.")
__("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.")
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -56,7 +56,10 @@ init python:
try:
# Open the URL.
self.urlfile = urllib2.urlopen(url)
import ssl
context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=renpy.loader.transfn("cacert.pem"))
self.urlfile = urllib2.urlopen(url, context=context)
t = threading.Thread(target=self.thread)
t.daemon = True
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 77 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 687 B

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 B

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

+2 -1
View File
@@ -84,7 +84,8 @@ init -1 python:
self.info_msg = ""
with open(self.filename, "w"):
with open(self.filename, "w") as f:
f.write(renpy.version() + "\n")
pass
def log(self, msg):
+2
View File
@@ -286,6 +286,7 @@ init python:
pass
build.classify_renpy("rapt/**", "rapt")
build.executable("rapt/prototype/gradlew")
build.classify_renpy("renios/prototype/base/", None)
build.classify_renpy("renios/prototype/prototype.xcodeproj/*.xcworkspace/", None)
@@ -366,6 +367,7 @@ init python:
build.classify_renpy("module/pysdlsound/", "source")
build.classify_renpy("module/pysdlsound/*.py", "source")
build.classify_renpy("module/pysdlsound/*.pyx", "source")
build.classify_renpy("module/fribidi-src/**", "source")
# all-platforms binary.
build.classify_renpy("lib/**/_renpysteam*", None)
+1
View File
@@ -131,6 +131,7 @@ init python in project:
data.setdefault("packages", [ "pc", "mac" ])
data.setdefault("add_from", True)
data.setdefault("force_recompile", True)
data.setdefault("android_build", "Release")
if "renamed_all" not in data:
dp = data["packages"]
+1 -1
View File
@@ -138,7 +138,7 @@ translate arabic strings:
new "## حجم الخط الذي يحيط بصندوق اسم الشخصية, الاحجام بالترتيب هي اليسار, الأعلى, اليمين, و الأسفل."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## عندما يتم اختيار True سيتم تكرار الخلفية حتى تغطي الصندوق, عند اختيار False سيتم تمديد الصورة لتغطي الصندوق."
# gui.rpy:132
+2 -2
View File
@@ -138,8 +138,8 @@ translate finnish strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+1 -1
View File
@@ -138,7 +138,7 @@ translate french strings:
new "## Les bordures de la zone contenant le nom du personnage dans lordre suivant gauche, haut, droite, bas."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Si « True » (vrai), larrière plan de zone du nom sera en mosaïque, si « False »(faux), larrière plan de la zone du nom sera mis à l’échelle."
# gui.rpy:132
+2 -2
View File
@@ -138,8 +138,8 @@ translate german strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+2 -2
View File
@@ -138,8 +138,8 @@ translate greek strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+1 -1
View File
@@ -138,7 +138,7 @@ translate indonesian strings:
new "## Tepi kotak bersisi urutan nama karakter, di kiri, atas, kanan, bawah."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Jika Benar, latar dari kotaknama akan di beri judul, jika Salah, latar dari kotaknama akan di ukur ulang."
# gui.rpy:132
+1 -1
View File
@@ -138,7 +138,7 @@ translate italian strings:
new "## I bordi del riquadro che contiene il nome del personaggio, in questo ordine: sinistro, superiore, destro, inferiore."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Se 'True', lo sfondo di namebox sarà tassellato (ripetuto come una piastrella). Se 'False' sarà invece scalato."
# gui.rpy:132
+1 -1
View File
@@ -142,7 +142,7 @@ translate japanese strings:
new "## ネームボックスのボーダーのサイズ。左、上、右、下の順で指定します。ボックスのサイズは、その中に表示されるキャラクター名のサイズから更にボーダー分拡張したサイズになります。"
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## True に設定すると、ネームボックスの背景画像をスケーリングではなくタイリングで表示します。"
# gui.rpy:132
+45 -45
View File
@@ -3,155 +3,155 @@ translate korean strings:
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Monday"
new "{#weekday}월요일"
# 00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}Tuesday"
new "{#weekday}화요일"
# 00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}Wednesday"
new "{#weekday}수요일"
# 00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}Thursday"
new "{#weekday}목요일"
# 00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}Friday"
new "{#weekday}금요일"
# 00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}Saturday"
new "{#weekday}토요일"
# 00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}Sunday"
new "{#weekday}일일"
# 00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}Mon"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}Tue"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}Wed"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}Thu"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}Fri"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}Sat"
new "{#weekday_short}"
# 00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}Sun"
new "{#weekday_short}"
# 00action_file.rpy:47
old "{#month}January"
new "{#month}January"
new "{#month}1월"
# 00action_file.rpy:47
old "{#month}February"
new "{#month}February"
new "{#month}2월"
# 00action_file.rpy:47
old "{#month}March"
new "{#month}March"
new "{#month}3월"
# 00action_file.rpy:47
old "{#month}April"
new "{#month}April"
new "{#month}4월"
# 00action_file.rpy:47
old "{#month}May"
new "{#month}May"
new "{#month}5월"
# 00action_file.rpy:47
old "{#month}June"
new "{#month}June"
new "{#month}6월"
# 00action_file.rpy:47
old "{#month}July"
new "{#month}July"
new "{#month}7월"
# 00action_file.rpy:47
old "{#month}August"
new "{#month}August"
new "{#month}8월"
# 00action_file.rpy:47
old "{#month}September"
new "{#month}September"
new "{#month}9월"
# 00action_file.rpy:47
old "{#month}October"
new "{#month}October"
new "{#month}10월"
# 00action_file.rpy:47
old "{#month}November"
new "{#month}November"
new "{#month}11월"
# 00action_file.rpy:47
old "{#month}December"
new "{#month}December"
new "{#month}12월"
# 00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}Jan"
new "{#month_short}1월"
# 00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}Feb"
new "{#month_short}2월"
# 00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}Mar"
new "{#month_short}3월"
# 00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}Apr"
new "{#month_short}4월"
# 00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}May"
new "{#month_short}5월"
# 00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}Jun"
new "{#month_short}6월"
# 00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}Jul"
new "{#month_short}7월"
# 00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}Aug"
new "{#month_short}8월"
# 00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}Sep"
new "{#month_short}9월"
# 00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}Oct"
new "{#month_short}10월"
# 00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}Nov"
new "{#month_short}11월"
# 00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}Dec"
new "{#month_short}12월"
# 00action_file.rpy:235
old "%b %d, %H:%M"
@@ -187,7 +187,7 @@ translate korean strings:
# 00gui.rpy:233
old "Are you sure you want to end the replay?"
new "Are you sure you want to end the replay?"
new "리플레이를 종료하겠습니까?"
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
@@ -199,7 +199,7 @@ translate korean strings:
# 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 "다음 선택지가 나타날 때까지 본 적이 없는 대사까지 모두 스킵하겠습니까?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
@@ -207,15 +207,15 @@ translate korean strings:
# 00library.rpy:142
old "Self-voicing disabled."
new "Self-voicing disabled."
new "대사 읽기를 끕니다."
# 00library.rpy:143
old "Clipboard voicing enabled. "
new "Clipboard voicing enabled. "
new "대사 복사하기를 켭니다. "
# 00library.rpy:144
old "Self-voicing enabled. "
new "Self-voicing enabled. "
new "대사 읽기를 켭니다. "
# 00library.rpy:179
old "Skip Mode"
@@ -223,7 +223,7 @@ translate korean 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}."
new "이 프로그램은 MIT 라이선스와 GNU 라이선스를 포함한 여러 가지 라이선스의 적용을 받는 오픈소스 소프트웨어를 포함하고 있습니다. {a=https://www.renpy.org/l/license}이곳{/a}에서 포함된 모든 소프트웨어와 그 소스코드를 확인할 수 있습니다."
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
@@ -239,7 +239,7 @@ translate korean strings:
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
new "앱스토어와 통신 중\n잠시만 기다려주십시오..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
+10 -10
View File
@@ -23,7 +23,7 @@ translate korean strings:
# 00gltest.rpy:93
old "Enable"
new "Enable"
new "활성"
# 00gltest.rpy:109
old "Changes will take effect the next time this program is run."
@@ -91,27 +91,27 @@ translate korean strings:
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Select Gamepad to Calibrate"
new "보정할 게임패드 선택"
# 00gamepad.rpy:35
old "No Gamepads Available"
new "No Gamepads Available"
new "사용 가능한 게임패드가 없습니다."
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Calibrating [name] ([i]/[total])"
new "[name]를 보정 중입니다. ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Press or move the [control!r] [kind]."
new "[control!r] [kind]를 누르거나 이동합니다."
# 00gamepad.rpy:66
old "Skip (A)"
new "Skip (A)"
new "스킵 (A)"
# 00gamepad.rpy:69
old "Back (B)"
new "Back (B)"
new "뒤로 (B)"
# _errorhandling.rpym:495
old "Open Traceback"
@@ -123,11 +123,11 @@ translate korean strings:
# _errorhandling.rpym:499
old "Copy to Clipboard"
new "Copy to Clipboard"
new "클립보드로 복사"
# _errorhandling.rpym:501
old "Copies the traceback.txt file to the clipboard."
new "Copies the traceback.txt file to the clipboard."
new "traceback.txt 파일을 클립보드로 복사합니다."
# _errorhandling.rpym:519
old "An exception has occurred."
@@ -175,5 +175,5 @@ translate korean strings:
# _errorhandling.rpym:612
old "Copies the errors.txt file to the clipboard."
new "Copies the errors.txt file to the clipboard."
new "errors.txt 파일을 클립보드로 복사합니다."
+103 -103
View File
@@ -3,409 +3,409 @@ translate korean strings:
# gui.rpy:2
old "## Initialization"
new "## Initialization"
new "## 초기화"
# gui.rpy:5
old "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## 이 파일에서 init offset 문을 사용하면 이 파일의 init 코드가 다른 파일의 init 코드보다 먼저 실행됩니다."
# 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의 호출은 스타일을 합리적인 기본값으로 재설정하고, 게임의 너비(width)와 높이(height)를 설정합니다."
# gui.rpy:21
old "## Colors"
new "## Colors"
new "## 색상"
# gui.rpy:23
old "## The colors of text in the interface."
new "## The colors of text in the interface."
new "## 인터페이스에서 글자의 색상입니다."
# 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 "## 강조 색상은 레이블(label)과 강조된 글자로 인터페이스 전체에서 사용됩니다."
# 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 "## 텍스트 버튼(text button)이 선택(selected)됐거나 커서를 올리지(hovered) 않았을 때 사용됩니다."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## 작은(small) 색상은 같은 효과를 내기 위해 더 밝거나 어두워야 하는 작은 글자에 사용됩니다."
# 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 "## 버튼(button)과 막대(bar)에 커서를 올렸을 때(hovered) 사용됩니다."
# gui.rpy:39
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## 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 "## 텍스트 버튼(text button)에 선택됐지만(selected) 포커스되지(focused) 않았을 때 사용됩니다. 버튼(button)은 현재 화면이거나 설정값인 경우 선택됨(selected)이 됩니다."
# 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 "## 텍스트 버튼(text button)이 선택되지(selected) 않았을 때 사용됩니다."
# gui.rpy:46
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## 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 "## 채워지지 않은 빈 막대(bar)에 사용됩니다. 이것은 바로 사용되지 않지만, 막대(bar) 이미지 파일이 재생성됐을 때 사용됩니다."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## The colors used for dialogue and menu choice text."
new "## 대사(dialogue)와 선택지(menu choice)의 글자에서 사용됩니다."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fonts and Font Sizes"
new "## 글자와 글자 크기"
# gui.rpy:58
old "## The font used for in-game text."
new "## The font used for in-game text."
new "## 인-게임 글자에 사용됩니다."
# gui.rpy:61
old "## The font used for character names."
new "## The font used for character names."
new "## 캐릭터의 이름에 사용됩니다."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## The font used for out-of-game text."
new "## 인터페이스에 사용됩니다."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## The size of normal dialogue text."
new "## 일반 대사의 글자 크기입니다."
# gui.rpy:70
old "## The size of character names."
new "## The size of character names."
new "## 캐릭터 이름의 글자 크기입니다."
# 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 "## 게임의 유저 인터페이스에서 글자의 크기입니다."
# 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 "## 게임의 유저 인터페이스에서 레이블(label)들의 글자 크기입니다."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## The size of text on the notify screen."
new "## 통지(notify) 화면의 글자 크기입니다."
# gui.rpy:82
old "## The size of the game's title."
new "## The size of the game's title."
new "## 게임의 타이틀(title) 글자의 크기입니다."
# gui.rpy:86
old "## Main and Game Menus"
new "## Main and Game Menus"
new "## 메인과 게임 메뉴들"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## The images used for the main and game menus."
new "## 이미지들은 메인(main)과 게임 메뉴(game menu)에 사용됩니다."
# 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 "## 게임의 이름과 버전을 보여줘야 할까요?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogue"
new "## 대사"
# 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 "## 이러한 변수들은 한 번에 한 줄의 대사가 어떻게 화면에 표시되는지 제어합니다."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## The height of the textbox containing dialogue."
new "## 대사를 포함하는 텍스트 박스의 높이입니다."
# 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 "## 화면에 텍스트박스를 세로로 배치합니다. 0.0은 최상단, 0.5는 중앙, 그리고 1.0은 최하단입니다."
# 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 "## 말하는 캐릭터의 이름을 텍스트 박스를 기준으로 배치합니다. 이것은 좌측이나 최상단으로부터 전체 픽셀값의 숫자가 되거나, 0.5로 중앙이 될 수 있습니다."
# 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 "## 캐릭터들의 이름을 수평으로 정렬합니다. 이것은 0.0으로 좌측 정렬, 0.5로 중앙, 그리고 1.0으로 우측 정렬될 수 있습니다."
# 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 "## 캐릭터들의 이름이 들어 있는 박스의 너비, 높이, 그리고 테두리입니다. 혹은 그것을 None으로 자동 설정할 수 있습니다."
# 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 "## 캐릭터의 이름이 들어 있는 박스의 테두리를 좌측, 상단, 우측, 하단의 순서로 정합니다."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## 만약 참(True)이면, 네임박스의 배경은 바둑판식으로 배열(tiled)될 것이고, 거짓(False)이면, 네임박스의 배경은 채워질(scaled) 것입니다."
# gui.rpy:132
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
new "## 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 "## 텍스트박스에서 대사의 위치입니다. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## The maximum width of dialogue text, in pixels."
new "## 픽셀값에서 대사의 최대 너비입니다."
# 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 "## 대사 글자의 수평 정렬입니다. 이것은 0.0으로 좌측 정렬, 0.5로 중앙, 그리고 1.0으로 우측 정렬이 될 수 있습니다."
# gui.rpy:146
old "## Buttons"
new "## Buttons"
new "## 버튼들"
# 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 "## 이러한 변수들은 GUI/버튼에서 이미지 파일들과 함께 어떻게 버튼이 표시되는지 제어합니다."
# 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 "## 픽셀값에서 버튼의 너비와 높이입니다. 만약 None이면, 렌파이가 크기를 계산합니다."
# 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 "## 좌측, 상단, 우측, 하단의 순서에서 버튼의 테두리 값입니다."
# 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 "## 만약 참(True)이면, 배경 이미지는 바둑판식으로 배열(tiled)될 것입니다. 만약 거짓(False)이면, 배경 이미지는 선으로 채워질(scaled) 것입니다."
# gui.rpy:162
old "## The font used by the button."
new "## The font used by the button."
new "## 버튼에 사용된 글자의 폰트입니다."
# gui.rpy:165
old "## The size of the text used by the button."
new "## The size of the text used by the button."
new "## 버튼에 사용된 글자의 크기입니다."
# 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 "## 이러한 변수는 다른 종류의 버튼 설정을 덮어씌웁니다. 사용 가능한 버튼의 종류와, 각각 무엇을 위해 사용하는지는 gui 문서를 확인해주세요."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## These customizations are used by the default interface:"
new "## 이러한 사용자 지정은 기본 인터페이스에 사용됩니다:"
# 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 "## 당신은 또한 설정된 이름의 변수를 추가함으로써 당신만의 커스텀을 추가할 수 있습니다. 예를 들어, 다음 행의 주석 표시를 제거하여 탐색(navigation) 버튼의 너비를 설정할 수 있습니다."
# gui.rpy:205
old "## Choice Buttons"
new "## Choice Buttons"
new "## 선택 버튼들"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Choice buttons are used in the in-game menus."
new "## 선택 버튼은 인-게임 메뉴에 사용됩니다."
# gui.rpy:220
old "## File Slot Buttons"
new "## File Slot Buttons"
new "## 파일 슬롯 버튼"
# 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 "## 파일 슬롯 버튼은 버튼의 특별한 종류입니다. 그것은 썸네일 이미지나 저장 슬롯의 콘텐츠를 설명하는 글자를 포함합니다. GUI/버튼에서 저장 슬롯은 버튼의 다른 종류와 같은 이미지 파일을 사용합니다."
# gui.rpy:226
old "## The save slot button."
new "## The save slot button."
new "## 저장 슬롯 버튼입니다."
# 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 "## 저장 슬롯에 사용되는 썸네일의 너비와 높이입니다."
# 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 "## 저장 슬롯의 그리드(grid)에서 행(rows)과 열(columns)의 갯수입니다."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Positioning and Spacing"
new "## 위치와 간격"
# 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 "## 이러한 변수들은 다양한 사용자 인터페이스 요소들의 위치와 간격을 제어합니다."
# 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 "## 화면의 왼쪽을 기준으로 하는 네비게이션 버튼의 왼쪽 위치입니다."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## The vertical position of the skip indicator."
new "## 스킵 표시기(skip indicator)의 수직 위치입니다."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## The vertical position of the notify screen."
new "## 통지(notify) 스크린의 수직 위치입니다."
# gui.rpy:258
old "## The spacing between menu choices."
new "## The spacing between menu choices."
new "## 선택지의 메뉴 선택 간의 간격입니다."
# 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 "## 메인과 게임 메뉴에서 네비게이션 섹션의 버튼들 간의 간격입니다."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Controls the amount of spacing between preferences."
new "## 환경 설정들 간의 간격을 제어합니다."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Controls the amount of spacing between preference buttons."
new "## 환경 설정 버튼들 사이의 간격을 제어합니다."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## The spacing between file page buttons."
new "## 파일 페이지 버튼들 간의 간격입니다."
# gui.rpy:273
old "## The spacing between file slots."
new "## The spacing between file slots."
new "## 파일 슬롯들 간의 간격입니다."
# gui.rpy:277
old "## Frames"
new "## Frames"
new "## 프레임들"
# 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 "## 이러한 변수들은 오버레이되거나 창이 없을 때 보여지는 사용자 인터페이스 구성 요소들을 포함하는 프레임을 제어합니다."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Generic frames that are introduced by player code."
new "## 플레이어 코드에 의해 소개되는 일반 프레임."
# 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."
new "## 프레임은 확인(confirm) 화면의 일부로 사용됩니다."
# 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 "## 프레임은 스킵(skip) 화면의 일부로 사용됩니다."
# 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 "## 프레임은 통지(notify) 화면의 일부로 사용됩니다."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Should frame backgrounds be tiled?"
new "## 프레임 배경들은 바둑판식으로 배열해야 할까요?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Bars, Scrollbars, and Sliders"
new "## 막대, 스크롤바, 슬라이더"
# 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 "## 이러한 설정은 막대와 스크롤바, 그리고 슬라이더의 보여지는 것과 크기를 제어합니다."
# 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 "## 기본 GUI는 슬라이더와 세로 스크롤바만 사용합니다. 다른 모든 막대들은 창작자가 작성한 코드에서 사용됩니다."
# 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 "## 수평 막대, 스크롤바, 슬라이더의 높이. 수직 막대, 스크롤바, 슬라이더의 너비."
# 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 "## 막대 이미지가 바둑판식 배열돼야 하면 참(True)입니다. 선으로 채워져야 한다면 거짓(False)입니다."
# gui.rpy:316
old "## Horizontal borders."
new "## Horizontal borders."
new "## 수평 테두리입니다."
# gui.rpy:321
old "## Vertical borders."
new "## Vertical borders."
new "## 수직 테두리입니다."
# 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 "## GUI에서 스크롤할 수 없는 스크롤 막대로 뭘 할 수 있나요? \"hide\"로 그것들을 숨기고, None은 그것들을 보여줍니다."
# gui.rpy:331
old "## History"
new "## History"
new "## 다시보기"
# 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 "## 다시보기 화면은 사용자가 이미 확인한 다이얼로그를 표시합니다."
# 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 "## 렌파이가 보관할 다시보기의 블록 갯수입니다."
# 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 "## 다시보기 화면 항목의 높이를 지정하거나 None으로 하여 높이를 성능에 맡길 수 있습니다."
# 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 "## 말하는 캐릭터의 이름을 나타내는 레이블의 위치, 너비, 그리고 정렬입니다."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## The position, width, and alignment of the dialogue text."
new "## 대사 글자의 위치, 너비, 그리고 정렬입니다."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Mode"
new "## NVL-모드"
# 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-모드 화면은 NVL-모드 캐릭터들에 의한 대화를 화면에 표시합니다."
# 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-모드 배경 창에서 배경의 테두리입니다."
# 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-모드 항목의 높이입니다. 이것을 None으로 설정하면 항목들은 동적으로 높이를 조정합니다."
# 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 "## gui.nvl_height 값이 None일 때 NVL-모드 항목들, 그리고 NVL-모드 항목들과 NVL-모드 메뉴간의 간의 간격입니다."
# 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.)"
new "## nvl_thought 글자의 위치, 너비, 정렬(nvl_narrator 캐릭터에 의해 표시되는 글자)입니다."
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## The position of nvl menu_buttons."
new "## NVL 메뉴 버튼의 위치입니다."
# 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 "## 이것은 휴대전화와 태블릿에서 쉽게 터지할 수 있도록 빠른(Quick) 버튼들의 크기를 크게 합니다."
# 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 "## 이것은 휴대전화에서 다양한 GUI 요소들의 크기와 간격을 쉽게 보일 수 있도록 변경합니다."
# gui.rpy:413
old "## Font sizes."
new "## Font sizes."
new "## 글자 크기들."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Adjust the location of the textbox."
new "## 텍스트박스의 위치를 조정합니다."
# 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 "## 게임 메뉴에서 항목들의 크기와 간격을 변경합니다."
# gui.rpy:436
old "## File button layout."
new "## File button layout."
new "## 파일 버튼 레이아웃."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-mode."
new "## NVL-모드."
# gui.rpy:456
old "## Quick buttons."
new "## Quick buttons."
new "## 빠른(Quick) 버튼들."
+49 -49
View File
@@ -99,7 +99,7 @@ translate korean strings:
# android.rpy:50
old "Retrieves the log from the Android device and writes it to a file."
new "Retrieves the log from the Android device and writes it to a file."
new "안드로이드 기기와 쓰여진 파일로부터 로그를 검색합니다."
# android.rpy:240
old "Copying Android files to distributions directory."
@@ -195,7 +195,7 @@ translate korean strings:
# android.rpy:544
old "Retrieving logcat information from device."
new "Retrieving logcat information from device."
new "기기로부터 로그캣 정보를 검색합니다."
# choose_directory.rpy:73
old "Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."
@@ -231,7 +231,7 @@ translate korean strings:
# consolecommand.rpy:84
old "The command is being run in a new operating system console window."
new "The command is being run in a new operating system console window."
new "커맨드가 새로운 운영체제 콘솔 창에서 실행 중입니다."
# distribute.rpy:443
old "Scanning project files..."
@@ -259,19 +259,19 @@ translate korean strings:
# distribute.rpy:1050
old "Unpacking the Macintosh application for signing..."
new "Unpacking the Macintosh application for signing..."
new "서명을 위해 매킨토시 애플리케이션을 압축해제하는 중입니다..."
# distribute.rpy:1060
old "Signing the Macintosh application..."
new "Signing the Macintosh application..."
new "매킨토시 애플리케이션을 서명하는 중입니다..."
# distribute.rpy:1082
old "Creating the Macintosh DMG..."
new "Creating the Macintosh DMG..."
new "매킨토시 DMG를 생성하는 중입니다..."
# distribute.rpy:1091
old "Signing the Macintosh DMG..."
new "Signing the Macintosh DMG..."
new "매킨토시 DMG에 서명하는 중입니다..."
# distribute.rpy:1248
old "Writing the [variant] [format] package."
@@ -523,23 +523,23 @@ translate korean strings:
# gui7.rpy:236
old "Select Accent and Background Colors"
new "Select Accent and Background Colors"
new "강조와 배경 색상 선택"
# gui7.rpy:250
old "Please click on the color scheme you wish to use, then click Continue. These colors can be changed and customized later."
new "Please click on the color scheme you wish to use, then click Continue. These colors can be changed and customized later."
new "원하는 색상 스키마를 선택하고 다음을 누르세요. 이러한 색상과 사용자 지정은 나중에 변경할 수 있습니다."
# gui7.rpy:294
old "{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?"
new "{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?"
new "{b}경고g{/b}\n계속하면 사용자 지정된 막대, 버튼, 저장 슬롯, 스크롤바, 그리고 슬라이더 이미지들을 덮어씌웁니다.\n\n무엇을 하고 싶으세요?"
# gui7.rpy:294
old "Choose new colors, then regenerate image files."
new "Choose new colors, then regenerate image files."
new "새로운 색상을 선택하면 이미지 파일들이 재생성됩니다."
# gui7.rpy:294
old "Regenerate the image files using the colors in gui.rpy."
new "Regenerate the image files using the colors in gui.rpy."
new "gui.rpy에서 사용하는 색상으로 이미지 파일 재생성."
# gui7.rpy:314
old "PROJECT NAME"
@@ -563,15 +563,15 @@ translate korean strings:
# gui7.rpy:341
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."
new "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."
new "프로젝트에서 어떤 해상도를 사용하나요? 렌파이가 창을 위아래로 확장 할 수 있지만, 이것은 창의 초기 크기, 에셋이 그려지는 크기, 애셋이 가장 선명하게 될 크기입니다.\n\n1280x720의 기본값은 적절한 절충안입니다."
# gui7.rpy:389
old "Creating the new project..."
new "Creating the new project..."
new "새 프로젝트를 만드는 중..."
# gui7.rpy:391
old "Updating the project..."
new "Updating the project..."
new "프로젝트 업데이트중..."
# interface.rpy:107
old "Documentation"
@@ -735,27 +735,27 @@ translate korean strings:
# itch.rpy:60
old "The built distributions could not be found. Please choose 'Build' and try again."
new "The built distributions could not be found. Please choose 'Build' and try again."
new "빌드된 배포판을 찾을 수 없습니다. '빌드'를 선택하고 다시 시도하세요."
# itch.rpy:91
old "No uploadable files were found. Please choose 'Build' and try again."
new "No uploadable files were found. Please choose 'Build' and try again."
new "업로드가능한 파일이 없습니다. '빌드'를 선택하고 다시 시도하세요."
# itch.rpy:99
old "The butler program was not found."
new "The butler program was not found."
new "집사(butler) 프로그램이 없습니다."
# itch.rpy:99
old "Please install the itch.io app, which includes butler, and try again."
new "Please install the itch.io app, which includes butler, and try again."
new "집사(butler)를 포함한 itch.io 앱을 설치하고 다시 시도하세요."
# itch.rpy:108
old "The name of the itch project has not been set."
new "The name of the itch project has not been set."
new "itch 프로젝트의 이름이 설정되지 않았습니다."
# itch.rpy:108
old "Please {a=https://itch.io/game/new}create your project{/a}, then add a line like \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} to options.rpy."
new "Please {a=https://itch.io/game/new}create your project{/a}, then add a line like \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} to options.rpy."
new "{a=https://itch.io/game/new}프로젝트를 만드세요{/a}, 그리고 options.rpy에 다음과 같은 라인을 작성하세요: \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5}."
# mobilebuild.rpy:109
old "{a=%s}%s{/a}"
@@ -827,23 +827,23 @@ translate korean strings:
# new_project.rpy:38
old "New GUI Interface"
new "New GUI Interface"
new "새로운 GUI 인터페이스"
# new_project.rpy:48
old "Both interfaces have been translated to your language."
new "Both interfaces have been translated to your language."
new "모든 인터페이스는 귀하의 언어로 번역됐습니다."
# new_project.rpy:50
old "Only the new GUI has been translated to your language."
new "Only the new GUI has been translated to your language."
new "새로운 GUI만 귀하의 언어로 번역됐습니다."
# new_project.rpy:52
old "Only the legacy theme interface has been translated to your language."
new "Only the legacy theme interface has been translated to your language."
new "레거시 테마 인터페이스가 귀하의 언어로 번역됐습니다."
# new_project.rpy:54
old "Neither interface has been translated to your language."
new "Neither interface has been translated to your language."
new "어느 인터페이스도 귀하의 언어로 번역되지 않았습니다."
# new_project.rpy:63
old "The projects directory could not be set. Giving up."
@@ -851,11 +851,11 @@ translate korean strings:
# new_project.rpy:69
old "Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."
new "Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."
new "어떤 인터페이스를 사용하고 싶으세요? 새로운 GUI는 현대적인 스타일로, 와이드 스크린과 휴대기기를 지원하며 쉽게 커스텀 가능합니다. 레거시 테마는 작업에 오래된 예제 코드가 필요할 수 있습니다.\n\n[language_support!t]\n\n의심스럽다면 새로운 GUI를 선택한 다음, 오른쪽 하단의 계속하기를 클릭하십시오."
# new_project.rpy:69
old "Legacy Theme Interface"
new "Legacy Theme Interface"
new "레거시 테마 인터페이스"
# new_project.rpy:90
old "Choose Project Template"
@@ -991,11 +991,11 @@ translate korean strings:
# translations.rpy:63
old "Translations: [project.current.name!q]"
new "Translations: [project.current.name!q]"
new "번역: [project.current.name!q]"
# translations.rpy:104
old "The language to work with. This should only contain lower-case ASCII characters and underscores."
new "The language to work with. This should only contain lower-case ASCII characters and underscores."
new "작업할 언어. 소문자 ASCII 문자와 밑줄만 포함해야 합니다."
# translations.rpy:130
old "Generate empty strings for translations"
@@ -1003,19 +1003,19 @@ translate korean strings:
# translations.rpy:148
old "Generates or updates translation files. The files will be placed in game/tl/[persistent.translate_language!q]."
new "Generates or updates translation files. The files will be placed in game/tl/[persistent.translate_language!q]."
new "번역 파일을 생성하거나 업데이트합니다. 파일들은 in game/tl/[persistent.translate_language!q]에 배치됩니다."
# translations.rpy:168
old "Extract String Translations"
new "Extract String Translations"
new "문자열 번역 추출"
# translations.rpy:170
old "Merge String Translations"
new "Merge String Translations"
new "문자열 번역 병합"
# translations.rpy:175
old "Replace existing translations"
new "Replace existing translations"
new "기존 번역 대체"
# translations.rpy:176
old "Reverse languages"
@@ -1023,11 +1023,11 @@ translate korean strings:
# translations.rpy:180
old "Update Default Interface Translations"
new "Update Default Interface Translations"
new "기본 인터페이스 번역 업데이트"
# translations.rpy:200
old "The extract command allows you to extract string translations from an existing project into a temporary file.\n\nThe merge command merges extracted translations into another project."
new "The extract command allows you to extract string translations from an existing project into a temporary file.\n\nThe merge command merges extracted translations into another project."
new "추출 명령은 기존 프로젝트의 문자열 번역을 임시 파일로 추출 할 수 있습니다.\n\n병합 명령은 추출된 번역을 다른 프로젝트로 병합합니다."
# translations.rpy:224
old "Ren'Py is generating translations...."
@@ -1039,51 +1039,51 @@ translate korean strings:
# translations.rpy:248
old "Ren'Py is extracting string translations..."
new "Ren'Py is extracting string translations..."
new "문자열 번역을 추출하고 있습니다..."
# translations.rpy:251
old "Ren'Py has finished extracting [language] string translations."
new "Ren'Py has finished extracting [language] string translations."
new "[language] 문자열 번역 추출을 완료했습니다."
# translations.rpy:271
old "Ren'Py is merging string translations..."
new "Ren'Py is merging string translations..."
new "문자열 번역을 병합하고 있습니다..."
# translations.rpy:274
old "Ren'Py has finished merging [language] string translations."
new "Ren'Py has finished merging [language] string translations."
new "[language] 문자열 번역 병합을 완료했습니다."
# translations.rpy:282
old "Updating default interface translations..."
new "Updating default interface translations..."
new "기본 인터페이스 번역을 업데이트하고 있습니다..."
# translations.rpy:306
old "Extract Dialogue: [project.current.name!q]"
new "Extract Dialogue: [project.current.name!q]"
new "다이얼로그 추출: [project.current.name!q]"
# translations.rpy:322
old "Format:"
new "Format:"
new "포맷:"
# translations.rpy:330
old "Tab-delimited Spreadsheet (dialogue.tab)"
new "Tab-delimited Spreadsheet (dialogue.tab)"
new "탭으로 구분되는 스프레드시트 (dialogue.tab)"
# translations.rpy:331
old "Dialogue Text Only (dialogue.txt)"
new "Dialogue Text Only (dialogue.txt)"
new "대사 글자만 (dialogue.txt)"
# translations.rpy:344
old "Strip text tags from the dialogue."
new "Strip text tags from the dialogue."
new "텍스트 태그를 대사에서 제거합니다."
# translations.rpy:345
old "Escape quotes and other special characters."
new "Escape quotes and other special characters."
new "따옴표와 기타 특수 문자를 제거합니다."
# translations.rpy:346
old "Extract all translatable strings, not just dialogue."
new "Extract all translatable strings, not just dialogue."
new "모든 번역 가능한 문자열을 추출합니다."
# translations.rpy:374
old "Ren'Py is extracting dialogue...."
@@ -1091,7 +1091,7 @@ translate korean strings:
# translations.rpy:378
old "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[persistent.dialogue_format] in the base directory."
new "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[persistent.dialogue_format] in the base directory."
new "대사 추출을 완료했습니다. 추출된 대사는 기본 디렉토리의 dialogue.[persistent.dialogue_format]에서 찾을 수 있습니다."
# updater.rpy:75
old "Select Update Channel"
+48 -48
View File
@@ -3,193 +3,193 @@ translate korean strings:
# options.rpy:1
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 "## 이 파일은 귀하의 게임 커스텀으로 변경될 수 있는 옵션을 포함합니다."
# 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 "## 두 개의 '#' 표시로 시작되는 줄은 주석이며, 그것을 없애지 말아야 합니다. 한 개의 '#' 표시로 시작되는 줄은 주석 처리된 코드로 필요한 경우 제거해도 됩니다."
# options.rpy:10
old "## Basics"
new "## Basics"
new "## 기본"
# 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 "## 인간이 읽을 수 있는 게임의 이름. 기본 윈도우의 제목으로 사용되며, 인터페이스와 오류 보고에서 보여집니다."
# 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 "## 문자열을 _()로 둘러 쌓으면 씌우면 번역의 대상으로 표시됩니다."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 Default GUI"
new "렌파이 7 기본 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 "## 위에 주어진 제목이 주 메뉴 화면에 표시되는지 결정합니다. 제목을 숨기려면 이것을 False로 설정하십시오."
# options.rpy:26
old "## The version of the game."
new "## The version of the game."
new "## 게임의 버전입니다."
# 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 "## 게임의 about 스크린에 배치되는 텍스트입니다. 단락 사이에 빈 줄을 넣으려면 \\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 "## 배포판의 실행 파일과 디렉토리에 사용되는 게임의 약식 이름. 이것은 ASCII 전용이어야 하며 공백, 콜론 또는 세미콜론을 포함해서는 안 됩니다."
# options.rpy:44
old "## Sounds and music"
new "## Sounds and music"
new "## 음악과 음향"
# 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 "## 이 세 가지 변수는 기본적으로 플레이어에 표시되는 믹서를 제어합니다. 이들 중 하나를 False로 설정하면 해당 믹서가 숨겨집니다."
# 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 "## 사용자가 음향 또는 음성 채널에서 테스트 사운드를 재생할 수 있게 하려면 아래 줄의 주석을 제거하고 이를 사용하여 재생할 샘플 사운드를 설정하십시오."
# 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 "## 플레이어가 주 메뉴에 있을 때 재생할 오디오 파일을 설정하려면 다음 줄의 주석 처리를 제거하십시오. 이 파일은 중지되거나 다른 파일이 재생 될 때까지 계속 재생합니다."
# options.rpy:69
old "## Transitions"
new "## Transitions"
new "## 번역"
# 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 "## 이러한 변수는 특정 이벤트가 발생할 때 사용되는 전환을 설정합니다. 각 변수는 전환으로 설정해야 하며, 전환을 사용하지 말아야 한다는 것을 나타내려면 None으로 설정해야 합니다."
# options.rpy:75
old "## Entering or exiting the game menu."
new "## Entering or exiting the game menu."
new "## 게임 메뉴에 진입하거나 나갑니다."
# 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 "## 게임이 로드된 후 사용되는 전환입니다."
# 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 "## 게임 종료 후 주 메뉴에 진입할 때 사용됩니다."
# 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 "## 게임을 시작할 때 사용되는 전환을 설정하는 변수가 없습니다. 대신, 초기 장면을 표시한 후 with 문을 사용하십시오."
# options.rpy:96
old "## Window management"
new "## Window management"
new "## 창 관리"
# 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 "## 이것은 대사 창이 표시됐을 때 제어합니다. 만약 \"show\", 그것은 상항 표시됩니다. 만약 \"hide\", 그것은 대사가 주어질 때만 표시됩니다. 만약 \"auto\", 창은 장면(scene) 문 앞에 숨겨져 대화 상자가 표시되면 다시 표시됩니다."
# 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 "## 게임이 시작된 후에는 \"window show\", \"window hide\", 그리고 \"window auto\" 문을 사용하여 변경할 수 있습니다."
# options.rpy:109
old "## Transitions used to show and hide the dialogue window"
new "## Transitions used to show and hide the dialogue window"
new "## 대화 창을 표시하고 숨기는 데 사용되는 전환"
# options.rpy:115
old "## Preference defaults"
new "## Preference defaults"
new "## 환경설정 기본값"
# 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 "## 기본 글자 속도를 제어합니다. 기본적으로, 0은 즉시이며 다른 숫자는 초당 입력 할 문자 수입니다."
# 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 "## 기본 auto-forward 지연 시간입니다. 숫자가 클수록 대기 시간이 길어지며, 0 ~ 30이 유효한 범위가 됩니다."
# options.rpy:129
old "## Save directory"
new "## Save directory"
new "## 세이브 디렉토리"
# 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 "## 렌파이는 이 게임에 대한 저장 파일을 플랫폼 별로 배치합니다. 세이브 파일들은 여기에 있습니다:"
# options.rpy:134
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## 윈도우즈: %APPDATA\\RenPy\\<config.save_directory>"
# options.rpy:136
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## 매킨토시: $HOME/Library/RenPy/<config.save_directory>"
# options.rpy:138
old "## Linux: $HOME/.renpy/<config.save_directory>"
new "## Linux: $HOME/.renpy/<config.save_directory>"
new "## 리눅스: $HOME/.renpy/<config.save_directory>"
# 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 "## 이것은 일반적으로 변경해서는 안 되며, 항상 표현형식이 아닌 정확한 문자열이어야 합니다."
# options.rpy:146
old "## Icon ########################################################################'"
new "## Icon ########################################################################'"
new "## 아이콘 #######################################################################'"
# options.rpy:148
old "## The icon displayed on the taskbar or dock."
new "## The icon displayed on the taskbar or dock."
new "## 작업 표시 줄 또는 독에 표시되는 아이콘."
# options.rpy:153
old "## Build configuration"
new "## Build configuration"
new "## 빌드 구성"
# 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 "## 이 섹션은 렌파이가 프로젝트를 배포 파일로 만드는 방법을 제어합니다."
# 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 "## 다음 함수는 파일 패턴을 사용합니다. 파일 패턴은 대/소문자를 구분하지 않으며, /의 유무와 관계없이 기본 디렉터리의 상대 경로와 일치합니다. 여러 패턴이 일치하면 첫 번째 패턴이 사용됩니다."
# options.rpy:165
old "## In a pattern:"
new "## In a pattern:"
new "## 패턴 있음:"
# options.rpy:167
old "## / is the directory separator."
new "## / is the directory separator."
new "## / 는 디렉토리 구분 기호입니다."
# options.rpy:169
old "## * matches all characters, except the directory separator."
new "## * matches all characters, except the directory separator."
new "## * 는 디렉토리 구분자를 제외한 모든 문자와 일치합니다."
# options.rpy:171
old "## ** matches all characters, including the directory separator."
new "## ** matches all characters, including the directory separator."
new "## ** 는 디렉토리 구분자를 포함해 모든 문자와 일치합니다."
# 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 "## 예를 들어, \"*.txt\" 는 기본 디렉토리의 txt 파일들과 일치하고, \"game/**.ogg\" 는 게임 디렉토리 또는 그 서브 디렉토리의 ogg 파일들과 일치하며, \"**.psd\" 는 프로젝트에서 모든 곳의 psd 파일들과 일치합니다."
# 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 "## 파일을 None으로 분류하여 배포판으로부터 제외하십시오."
# options.rpy:185
old "## To archive files, classify them as 'archive'."
new "## To archive files, classify them as 'archive'."
new "## 파일을 아카이브하려면 '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 "## 파일들의 매칭 문서 패턴은 맥앱(Mac App) 빌드에서 중복되므로 app 및 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 "## 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 라이센스 키가 필요합니다. Google Play 개발자 콘솔의 \"서비스 및 API\"페이지에서 확인할 수 있습니다."
# 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.io project, separated by a slash."
new "## itch.io 프로젝트와 연관된 사용자 이름과 프로젝트 이름이며 슬래시로 구분됩니다."
+118 -118
View File
@@ -3,23 +3,23 @@ translate korean strings:
# screens.rpy:9
old "## Styles"
new "## Styles"
new "## 스타일"
# screens.rpy:87
old "## In-game screens"
new "## In-game screens"
new "## 게임내 스크린"
# screens.rpy:91
old "## Say screen"
new "## Say screen"
new "## Say 스크린"
# screens.rpy:93
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## 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 "## Say 스크린은 플레이어에게 대사를 출력할 때 씁니다. 화자 who와 대사 what, 두 개의 매개변수를 받습니다. (화자 이름이 없으면 who는 None일 수 있음)"
# 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 "## 이 스크린은 id \"what\"을 가진 텍스트 디스플레이어블을 생성해야 합니다. (이 디스플레이어블은 렌파이의 대사 출력에 필요합니다.) id \"who\" id \"window\" 디스플레이블이 존재할 경우 관련 스타일 속성이 적용됩니다."
# screens.rpy:102
old "## https://www.renpy.org/doc/html/screen_special.html#say"
@@ -27,15 +27,15 @@ translate korean strings:
# screens.rpy:169
old "## Input screen"
new "## Input screen"
new "## Input 스크린"
# 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 prompt parameter is used to pass a text prompt in."
new "## 플레이어 입력을 받는 renpy.input을 출력할 때 쓰이는 스크린입니다. prompt 매개변수를 통해 입력 지문을 표시할 수 있습니다."
# 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 "## 이 스크린은 id \"input\"을 가진 input 디스플레이어블을 생성해야 합니다."
# screens.rpy:177
old "## http://www.renpy.org/doc/html/screen_special.html#input"
@@ -43,11 +43,11 @@ translate korean strings:
# screens.rpy:205
old "## Choice screen"
new "## Choice screen"
new "## Choice 스크린"
# 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, is a list of objects, each with caption and action fields."
new "## menu 명령어로 생성된 게임내 선택지를 출력하는 스크린입니다. 한 개의 매개변수 items를 받고, 이는 선택지 내용(caption)과 선택지 결과(action)이 있는 오브젝트가 들어있는 리스트입니다."
# screens.rpy:211
old "## http://www.renpy.org/doc/html/screen_special.html#choice"
@@ -55,15 +55,15 @@ translate korean 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 "## True일 경우 narrator 캐릭터를 통해 지문을 표시합니다. False일 경우 지문이 비활성화 선택지로 표시됩니다."
# screens.rpy:244
old "## Quick Menu screen"
new "## Quick Menu screen"
new "## Quick Menu 스크린"
# 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 "## 퀵메뉴는 게임 외 메뉴 접근성을 높여주기 위해 게임 내에 표시됩니다."
# screens.rpy:261
old "Back"
@@ -79,7 +79,7 @@ translate korean strings:
# screens.rpy:264
old "Auto"
new "자동저장"
new "자동진행"
# screens.rpy:265
old "Save"
@@ -99,23 +99,23 @@ translate korean strings:
# 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 "## 플레이어가 UI(스크린)을 일부러 숨기지 않는 한 퀵메뉴가 게임 내에 오버레이로 출력되게 합니다."
# screens.rpy:291
old "## Navigation screen"
new "## Navigation screen"
new "## Navigation 스크린"
# 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 "## 이 스크린은 메인메뉴와 게임외 메뉴에 포함되어 다른 메뉴로 이동하거나 게임을 시작/종료할 수 있게 합니다."
# screens.rpy:308
old "Start"
new "Start"
new "시작하기"
# screens.rpy:316
old "Load"
new "Load"
new "로드"
# screens.rpy:318
old "Preferences"
@@ -123,7 +123,7 @@ translate korean strings:
# screens.rpy:322
old "End Replay"
new "End Replay"
new "리플레이 끝내기"
# screens.rpy:326
old "Main Menu"
@@ -135,7 +135,7 @@ translate korean 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 "## 도움말 메뉴는 모바일 디바이스와 맞지 않아 불필요합니다."
# screens.rpy:333
old "Help"
@@ -143,7 +143,7 @@ translate korean strings:
# 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 "## 종료 버튼은 iOS 규정에 어긋나고 안드로이드에는 불필요합니다."
# screens.rpy:336
old "Quit"
@@ -151,11 +151,11 @@ translate korean strings:
# screens.rpy:350
old "## Main Menu screen"
new "## Main Menu screen"
new "## Main Menu 스크린"
# 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 "## 렌파이가 시작할 때 메인메뉴를 출력합니다."
# screens.rpy:354
old "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
@@ -163,19 +163,19 @@ translate korean 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 명령어로 스크린 내에 다른 스크린을 불러옵니다. 메인 메뉴 스크린의 내용물은 navigation 스크린에 있습니다."
# screens.rpy:413
old "## Game Menu screen"
new "## Game Menu screen"
new "## Game Menu 스크린"
# 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 "## 게임 메뉴의 기본 틀입니다. 매개변수 title로 스크린 제목을 정하고, 배경, 제목, 그리고 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."
new "## scroll 매개변수는, None, \"viewport\" 혹은 \"vpgrid\" 중 하나여야 합니다. transclude 명령어를 통해 다른 스크린을 이 스크린 내부에 불러옵니다."
# screens.rpy:476
old "Return"
@@ -183,43 +183,43 @@ translate korean strings:
# screens.rpy:539
old "## About screen"
new "## About screen"
new "## About 스크린"
# 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 "## 이 스크린은 게임과 렌파이 엔진 크레딧과 저작권 정보를 표시합니다."
# 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 "## 특별할 것이 없으므로 스크린을 새로 커스터마이징하여 만드는 예제이기도 합니다."
# 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 "## use 명령어로 game_menu 스크린을 이 스크린 내에 불러옵니다. use 명령어 하위블럭(vbox 내용)은 game_menu 스크린 내 transclude 명령어가 있는 곳에 다시 불려집니다."
# screens.rpy:561
# screens.rpy:561
old "Version [config.version!t]\n"
new "Version [config.version!t]\n"
new "버젼 [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 의 내용은 보통 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 "{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 "## options.rpy에서 규정된 내용이 about 스크린에 추가됩니다."
# screens.rpy:582
old "## Load and Save screens"
new "## Load and Save screens"
new "## Load and Save 스크린"
# 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 "## 이 스크린은 세이브/로드에 쓰입니다. 거의 동일하기 때문에, file_slots 스크린을 불러와서 씁니다."
# screens.rpy:588
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
@@ -227,23 +227,23 @@ translate korean strings:
# screens.rpy:607
old "Page {}"
new "Page {}"
new "{} 페이지"
# screens.rpy:607
old "Automatic saves"
new "Automatic saves"
new "자동 세이브"
# screens.rpy:607
old "Quick saves"
new "Quick saves"
new "퀵세이브"
# 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 "## input (페이지 제목을 플레이어가 수정할 수 있음)이 세이브/로드 버튼보다 먼저 엔터에 반응하도록 합니다."
# screens.rpy:629
old "## The grid of file slots."
new "## The grid of file slots."
new "## 파일 슬롯 그리드."
# screens.rpy:649
old "{#file_time}%A, %B %d %Y, %H:%M"
@@ -251,11 +251,11 @@ translate korean strings:
# screens.rpy:649
old "empty slot"
new "empty slot"
new "빈 슬롯"
# screens.rpy:657
old "## Buttons to access other pages."
new "## Buttons to access other pages."
new "## 페이지 이동 버튼."
# screens.rpy:666
old "<"
@@ -263,11 +263,11 @@ translate korean strings:
# screens.rpy:668
old "{#auto_page}A"
new "{#auto_page}A"
new "{#auto_page}자동"
# screens.rpy:670
old "{#quick_page}Q"
new "{#quick_page}Q"
new "{#quick_page}"
# screens.rpy:676
old ">"
@@ -275,11 +275,11 @@ translate korean strings:
# screens.rpy:711
old "## Preferences screen"
new "## Preferences screen"
new "## Preferences 스크린"
# 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 "## Preferences 스크린에서는 각종 환경설정을 플레이어가 지정할 수 있습니다."
# screens.rpy:716
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
@@ -299,35 +299,35 @@ translate korean strings:
# screens.rpy:744
old "Rollback Side"
new "Rollback Side"
new "롤백 클릭 옵션"
# screens.rpy:745
old "Disable"
new "Disable"
new "비활성화"
# screens.rpy:746
old "Left"
new "Left"
new "화면 왼쪽 클릭"
# screens.rpy:747
old "Right"
new "Right"
new "화면 오른쪽 클릭"
# screens.rpy:752
old "Unseen Text"
new "Unseen Text"
new "읽지 않은 텍스트까지 모두 스킵"
# screens.rpy:753
old "After Choices"
new "선택지 이후 스킵"
new "선택지 이후에도 스킵"
# screens.rpy:754
old "Transitions"
new "화면 전환 효과"
new "화면 전환 효과를 모두 스킵"
# 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 "## \"radio_pref\" \"check_pref\" 를 추가하여 그 외에도 환경설정 항목을 추가할 수 있습니다."
# screens.rpy:767
old "Text Speed"
@@ -339,7 +339,7 @@ translate korean strings:
# screens.rpy:778
old "Music Volume"
new "배경음 크기"
new "배경음 크기"
# screens.rpy:785
old "Sound Volume"
@@ -355,15 +355,15 @@ translate korean strings:
# screens.rpy:806
old "Mute All"
new "Mute All"
new "모두 음소거"
# screens.rpy:882
old "## History screen"
new "## History screen"
new "## History 스크린"
# 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 "## 지난 대사록을 출력합니다. _history_list 에 저장된 대사 기록을 확인합니다."
# screens.rpy:888
old "## https://www.renpy.org/doc/html/history.html"
@@ -371,39 +371,39 @@ translate korean 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 "## 이 스크린은 내용이 아주 많을 수 있으므로 prediction을 끕니다."
# 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 "## history_height None일 경우 레이아웃이 틀어지지 않게 합니다."
# screens.rpy:914
old "## Take the color of the who text from the Character, if set."
new "## Take the color of the who text from the Character, if set."
new "## 화자 Character에 화자 색깔이 지정되어 있으면 불러옵니다."
# screens.rpy:921
old "The dialogue history is empty."
new "The dialogue history is empty."
new "대사가 없습니다."
# screens.rpy:965
old "## Help screen"
new "## Help screen"
new "## Help 스크린"
# 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 "## 입력장치의 기능을 설명합니다. 각 입력장치별 설정은 keyboard_help, mouse_help, gamepad_help 스크린을 각각 불러와서 출력합니다."
# screens.rpy:986
old "Keyboard"
new "Keyboard"
new "키보드"
# screens.rpy:987
old "Mouse"
new "Mouse"
new "마우스"
# screens.rpy:990
old "Gamepad"
new "Gamepad"
new "게임패드"
# screens.rpy:1003
old "Enter"
@@ -411,7 +411,7 @@ translate korean strings:
# screens.rpy:1004
old "Advances dialogue and activates the interface."
new "Advances dialogue and activates the interface."
new "대사 진행 및 UI (선택지 포함) 선택."
# screens.rpy:1007
old "Space"
@@ -419,23 +419,23 @@ translate korean strings:
# screens.rpy:1008
old "Advances dialogue without selecting choices."
new "Advances dialogue without selecting choices."
new "대사를 진행하되 선택지는 선택하지 않음."
# screens.rpy:1011
old "Arrow Keys"
new "Arrow Keys"
new "화살표 키"
# screens.rpy:1012
old "Navigate the interface."
new "Navigate the interface."
new "UI 이동."
# screens.rpy:1015
old "Escape"
new "Escape"
new "Esc"
# screens.rpy:1016
old "Accesses the game menu."
new "Accesses the game menu."
new "게임 메뉴 불러옴."
# screens.rpy:1019
old "Ctrl"
@@ -443,7 +443,7 @@ translate korean strings:
# screens.rpy:1020
old "Skips dialogue while held down."
new "Skips dialogue while held down."
new "누르고 있는 동안 대사를 스킵."
# screens.rpy:1023
old "Tab"
@@ -451,7 +451,7 @@ translate korean strings:
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Toggles dialogue skipping."
new "대사 스킵 토글."
# screens.rpy:1027
old "Page Up"
@@ -459,7 +459,7 @@ translate korean strings:
# screens.rpy:1028
old "Rolls back to earlier dialogue."
new "Rolls back to earlier dialogue."
new "이전 대사로 롤백."
# screens.rpy:1031
old "Page Down"
@@ -467,91 +467,91 @@ translate korean strings:
# screens.rpy:1032
old "Rolls forward to later dialogue."
new "Rolls forward to later dialogue."
new "이후 대사로 롤포워드."
# screens.rpy:1036
old "Hides the user interface."
new "Hides the user interface."
new "UI를 숨김."
# screens.rpy:1040
old "Takes a screenshot."
new "Takes a screenshot."
new "스크린샷 저장."
# 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 "{a=https://www.renpy.org/l/voicing}대사 읽어주기 기능{/a} 토글."
# screens.rpy:1050
old "Left Click"
new "Left Click"
new "클릭"
# screens.rpy:1054
old "Middle Click"
new "Middle Click"
new "가운데 버튼이나 휠버튼 클릭"
# screens.rpy:1058
old "Right Click"
new "Right Click"
new "우클릭"
# screens.rpy:1062
old "Mouse Wheel Up\nClick Rollback Side"
new "Mouse Wheel Up\nClick Rollback Side"
new "휠 위로\n롤백 클릭"
# screens.rpy:1066
old "Mouse Wheel Down"
new "Mouse Wheel Down"
new "휠 아래로"
# screens.rpy:1073
old "Right Trigger\nA/Bottom Button"
new "Right Trigger\nA/Bottom Button"
new "오른쪽 트리거(RT)\nA버튼/아래 버튼"
# screens.rpy:1074
old "Advance dialogue and activates the interface."
new "Advance dialogue and activates the interface."
new "대사 진행 및 UI (선택지 포함) 선택."
# screens.rpy:1078
old "Roll back to earlier dialogue."
new "Roll back to earlier dialogue."
new "이전 대사로 롤백."
# screens.rpy:1081
old "Right Shoulder"
new "Right Shoulder"
new "오른쪽 범퍼(RB)"
# screens.rpy:1082
old "Roll forward to later dialogue."
new "Roll forward to later dialogue."
new "이후 대사로 롤포워드."
# screens.rpy:1085
old "D-Pad, Sticks"
new "D-Pad, Sticks"
new "D-Pad, 아날로그 스틱"
# screens.rpy:1089
old "Start, Guide"
new "Start, Guide"
new "스타스 버튼/가이드 버튼"
# screens.rpy:1090
old "Access the game menu."
new "Access the game menu."
new "게임 메뉴 불러옴."
# screens.rpy:1093
old "Y/Top Button"
new "Y/Top Button"
new "Y버튼/위 버튼"
# screens.rpy:1096
old "Calibrate"
new "Calibrate"
new "조정"
# screens.rpy:1124
old "## Additional screens"
new "## Additional screens"
new "## 그 외 스크린"
# screens.rpy:1128
old "## Confirm screen"
new "## Confirm screen"
new "## Confirm 스크린"
# 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 "## 게임 입력 관련 예/아니오 질문을 플레이어에게 할 때 이 스크린을 표시합니다."
# screens.rpy:1133
old "## http://www.renpy.org/doc/html/screen_special.html#confirm"
@@ -559,7 +559,7 @@ translate korean 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 "## 이 스크린이 출력 중일 때 다른 스크린과 상호작용할 수 없게 합니다."
# screens.rpy:1161
old "Yes"
@@ -571,15 +571,15 @@ translate korean strings:
# screens.rpy:1164
old "## Right-click and escape answer \"no\"."
new "## Right-click and escape answer \"no\"."
new "## 우클릭과 esc는 '아니오'를 입력하는 것과 같습니다."
# screens.rpy:1191
old "## Skip indicator screen"
new "## Skip indicator screen"
new "## Skip indicator 스크린"
# 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 스크린은 스킵 중일 때 \"스킵 중\"을 표시하기 위해 출력됩니다."
# screens.rpy:1196
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
@@ -587,19 +587,19 @@ translate korean strings:
# screens.rpy:1208
old "Skipping"
new "Skipping"
new "스킵 중"
# 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 "## transform으로 화살표를 순서대로 페이드인/페이드아웃합니다."
# screens.rpy:1247
old "## Notify screen"
new "## Notify screen"
new "## Notify 스크린"
# 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 "## Notify 스크린으로 플레이어에게 메시지를 출력합니다. (예를 들어 '퀵세이브 완료'나 '스크린샷 저장 완료')"
# screens.rpy:1252
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
@@ -607,11 +607,11 @@ translate korean strings:
# screens.rpy:1286
old "## NVL screen"
new "## NVL screen"
new "## NVL 스크린"
# 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 "## NVL모드 대사와 선택지를 출력합니다."
# screens.rpy:1290
old "## http://www.renpy.org/doc/html/screen_special.html#nvl"
@@ -619,25 +619,25 @@ translate korean 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 "## vpgrid나 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 "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
new "## 선택지가 있을 경우, 선택지 출력. config.narrator_menu가 True일 경우 선택지가 비정상적으로 출력될 수 있습니다. (디폴트는 True입니다.)"
# 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 "## 동시에 출력될 수 있는 NVL 대사의 최대치를 조정합니다."
# screens.rpy:1406
old "## Mobile Variants"
new "## Mobile Variants"
new "## 모바일 버젼"
# 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 "## 마우스가 없고 화면이 작을 가능성이 높으므로, 퀵메뉴 버튼의 크기를 키우고 가짓수를 줄입니다."
# screens.rpy:1429
old "Menu"
new "Menu"
new "메뉴"
+814
View File
@@ -0,0 +1,814 @@
translate malay strings:
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Isnin"
# 00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}Selasa"
# 00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}Rabu"
# 00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}Khamis"
# 00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}Jumaat"
# 00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}Sabtu"
# 00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}Ahad"
# 00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}Isn"
# 00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}Sel"
# 00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}Rab"
# 00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}Kha"
# 00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}Jum"
# 00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}Sab"
# 00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}Aha"
# 00action_file.rpy:47
old "{#month}January"
new "{#month}Januari"
# 00action_file.rpy:47
old "{#month}February"
new "{#month}Februari"
# 00action_file.rpy:47
old "{#month}March"
new "{#month}Mac"
# 00action_file.rpy:47
old "{#month}April"
new "{#month}April"
# 00action_file.rpy:47
old "{#month}May"
new "{#month}Mei"
# 00action_file.rpy:47
old "{#month}June"
new "{#month}Jun"
# 00action_file.rpy:47
old "{#month}July"
new "{#month}Julai"
# 00action_file.rpy:47
old "{#month}August"
new "{#month}Ogos"
# 00action_file.rpy:47
old "{#month}September"
new "{#month}September"
# 00action_file.rpy:47
old "{#month}October"
new "{#month}Oktober"
# 00action_file.rpy:47
old "{#month}November"
new "{#month}November"
# 00action_file.rpy:47
old "{#month}December"
new "{#month}Disember"
# 00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}Jan"
# 00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}Feb"
# 00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}Mac"
# 00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}Apr"
# 00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}Mei"
# 00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}Jun"
# 00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}Jul"
# 00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}Ogo"
# 00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}Sep"
# 00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}Okt"
# 00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}Nov"
# 00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}Dis"
# 00action_file.rpy:237
old "%b %d, %H:%M"
new "%d %b, %H:%M"
# 00action_file.rpy:345
old "Save slot %s: [text]"
new "Simpan slot %s: [text]"
# 00action_file.rpy:421
old "Load slot %s: [text]"
new "Muatkan slot %s: [text]"
# 00action_file.rpy:466
old "Delete slot [text]"
new "Padam slot [text]"
# 00action_file.rpy:546
old "File page auto"
new "Halaman fail auto"
# 00action_file.rpy:548
old "File page quick"
new "Halaman fail cepat"
# 00action_file.rpy:550
old "File page [text]"
new "Halaman fail [text]"
# 00action_file.rpy:740
old "Next file page."
new "Halaman fail seterusnya."
# 00action_file.rpy:804
old "Previous file page."
new "Halaman fail sebelumnya."
# 00action_file.rpy:865
old "Quick save complete."
new "Simpan cepat selesai."
# 00action_file.rpy:883
old "Quick save."
new "Simpan cepat."
# 00action_file.rpy:902
old "Quick load."
new "Muat cepat."
# 00action_other.rpy:355
old "Language [text]"
new "Bahasa [text]"
# 00director.rpy:708
old "The interactive director is not enabled here."
new "Pengarah interaktif tidak dibolehkan di sini."
# 00director.rpy:1478
old "⬆"
new "⬆"
# 00director.rpy:1484
old "⬇"
new "⬇"
# 00director.rpy:1548
old "Done"
new "Selesai"
# 00director.rpy:1558
old "(statement)"
new "(kenyataan)"
# 00director.rpy:1559
old "(tag)"
new "(tag)"
# 00director.rpy:1560
old "(attributes)"
new "(atribut)"
# 00director.rpy:1561
old "(transform)"
new "(transformasi)"
# 00director.rpy:1586
old "(transition)"
new "(peralihan)"
# 00director.rpy:1598
old "(channel)"
new "(saluran)"
# 00director.rpy:1599
old "(filename)"
new "(nama fail)"
# 00director.rpy:1628
old "Change"
new "Tukar"
# 00director.rpy:1630
old "Add"
new "Tambah"
# 00director.rpy:1633
old "Cancel"
new "Batal"
# 00director.rpy:1636
old "Remove"
new "Buang"
# 00director.rpy:1671
old "Statement:"
new "Kenyataan:"
# 00director.rpy:1692
old "Tag:"
new "Tag:"
# 00director.rpy:1708
old "Attributes:"
new "Atribut:"
# 00director.rpy:1726
old "Transforms:"
new "Transformasi:"
# 00director.rpy:1745
old "Behind:"
new "Belakang:"
# 00director.rpy:1764
old "Transition:"
new "Peralihan"
# 00director.rpy:1782
old "Channel:"
new "Saluran:"
# 00director.rpy:1800
old "Audio Filename:"
new "Nama Fail Audio:"
# 00gui.rpy:370
old "Are you sure?"
new "Adakah anda pasti?"
# 00gui.rpy:371
old "Are you sure you want to delete this save?"
new "Adakah anda ingin memadam simpanan ini?"
# 00gui.rpy:372
old "Are you sure you want to overwrite your save?"
new "Adakah anda ingin menulis ganti simpanan anda?"
# 00gui.rpy:373
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Pemuatan akan menghilangkan kemajuan yang belum disimpan.\nAdakah anda ingin memuatkan simpanan lain?"
# 00gui.rpy:374
old "Are you sure you want to quit?"
new "Adakah anda ingin keluar?"
# 00gui.rpy:375
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Adakah anda pasti anda ingin kembali ke menu utama?\nAnda akan kehilangan kemajuan yang belum disimpan."
# 00gui.rpy:376
old "Are you sure you want to end the replay?"
new "Adakah anda ingin menamatkan ulang tayang ini?"
# 00gui.rpy:377
old "Are you sure you want to begin skipping?"
new "Adakah anda ingin memulakan langkauan?"
# 00gui.rpy:378
old "Are you sure you want to skip to the next choice?"
new "Adakah anda ingin melangkau ke pilihan seterusnya?"
# 00gui.rpy:379
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Adakah anda ingin melangkau dialog yang belum dilihat sehingga ke pilihan seterusnya?"
# 00keymap.rpy:258
old "Failed to save screenshot as %s."
new "Gagal menyimpan tangkap skrin sebagai %s."
# 00keymap.rpy:270
old "Saved screenshot as %s."
new "Tangkap skrin disimpan sebagai %s."
# 00library.rpy:146
old "Self-voicing disabled."
new "Penyuaraan sendiri dilumpuhkan."
# 00library.rpy:147
old "Clipboard voicing enabled. "
new "Penyuaraan papan keratan dibolehkan. "
# 00library.rpy:148
old "Self-voicing enabled. "
new "Penyuaraan sendiri dibolehkan. "
# 00library.rpy:150
old "bar"
new "bar"
# 00library.rpy:151
old "selected"
new "dipilih"
# 00library.rpy:152
old "viewport"
new "port pandang"
# 00library.rpy:153
old "horizontal scroll"
new "tatal melintang"
# 00library.rpy:154
old "vertical scroll"
new "tatal menegak"
# 00library.rpy:155
old "activate"
new "aktifkan"
# 00library.rpy:156
old "deactivate"
new "nyahaktifkan"
# 00library.rpy:157
old "increase"
new "naikkan"
# 00library.rpy:158
old "decrease"
new "turunkan"
# 00library.rpy:193
old "Skip Mode"
new "Mod Langkau"
# 00library.rpy:279
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 "Atur cara ini mengandungi perisian bebas di bawah beberapa lesen yang berbeza, termasuklah Lesen MIT dan Lesen Awam Am Lemah GNU. Senarai lengkap perisian, termasuk pautan ke kod sumber penuh, boleh dijumpai {a=https://www.renpy.org/l/license}di sini{/a}."
# 00preferences.rpy:207
old "display"
new "paparan"
# 00preferences.rpy:219
old "transitions"
new "peralihan"
# 00preferences.rpy:228
old "skip transitions"
new "langkau peralihan"
# 00preferences.rpy:230
old "video sprites"
new "peperi video"
# 00preferences.rpy:239
old "show empty window"
new "tunjukkan tetingkap kosong"
# 00preferences.rpy:248
old "text speed"
new "kelajuan tulisan"
# 00preferences.rpy:256
old "joystick"
new "kayu bedik"
# 00preferences.rpy:256
old "joystick..."
new "kayu bedik..."
# 00preferences.rpy:263
old "skip"
new "langkau"
# 00preferences.rpy:266
old "skip unseen [text]"
new "langkau [text] belum dilihat"
# 00preferences.rpy:271
old "skip unseen text"
new "langkau tulisan belum dilihat"
# 00preferences.rpy:273
old "begin skipping"
new "mula melangkau"
# 00preferences.rpy:277
old "after choices"
new "selepas pilihan"
# 00preferences.rpy:284
old "skip after choices"
new "langkau selepas pilihan"
# 00preferences.rpy:286
old "auto-forward time"
new "masa untuk gerak sendiri"
# 00preferences.rpy:300
old "auto-forward"
new "gerak sendiri"
# 00preferences.rpy:307
old "Auto forward"
new "Gerak sendiri"
# 00preferences.rpy:310
old "auto-forward after click"
new "gerak sendiri selepas klik"
# 00preferences.rpy:319
old "automatic move"
new "tetikus gerak sendiri"
# 00preferences.rpy:328
old "wait for voice"
new "tunggu suara"
# 00preferences.rpy:337
old "voice sustain"
new "biarkan suara"
# 00preferences.rpy:346
old "self voicing"
new "penyuaraan sendiri"
# 00preferences.rpy:355
old "clipboard voicing"
new "penyuaraan papan keratan"
# 00preferences.rpy:364
old "debug voicing"
new "penyuaraan nyahpepijat"
# 00preferences.rpy:373
old "emphasize audio"
new "menekankan audio"
# 00preferences.rpy:382
old "rollback side"
new "sisi untuk undur"
# 00preferences.rpy:392
old "gl powersave"
new "jimat tenaga gl"
# 00preferences.rpy:398
old "gl framerate"
new "kadar bingkai gl"
# 00preferences.rpy:401
old "gl tearing"
new "pengoyakan gl"
# 00preferences.rpy:413
old "music volume"
new "kekuatan muzik"
# 00preferences.rpy:414
old "sound volume"
new "kekuatan bunyi"
# 00preferences.rpy:415
old "voice volume"
new "kekuatan suara"
# 00preferences.rpy:416
old "mute music"
new "bisukan muzik"
# 00preferences.rpy:417
old "mute sound"
new "bisukan bunyi"
# 00preferences.rpy:418
old "mute voice"
new "bisukan suara"
# 00preferences.rpy:419
old "mute all"
new "bisukan semua"
# 00preferences.rpy:500
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Penyuaraan papan keratan dibolehkan. Tekan 'shift+C' untuk melumpuhkannya."
# 00preferences.rpy:502
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Penyuaraan sendiri akan berkata \"[renpy.display.tts.last]\". Tekan 'alt+shift+V' untuk melumpuhkannya."
# 00preferences.rpy:504
old "Self-voicing enabled. Press 'v' to disable."
new "Penyuaraan sendiri dibolehkan. Tekan 'v' untuk melumpuhkannya."
# _compat\gamemenu.rpym:198
old "Empty Slot."
new "Slot Kosong."
# _compat\gamemenu.rpym:355
old "Previous"
new "Sebelumnya"
# _compat\gamemenu.rpym:362
old "Next"
new "Seterusnya"
# _compat\preferences.rpym:428
old "Joystick Mapping"
new "Pemetaan Kayu Bedik"
# _developer\developer.rpym:38
old "Developer Menu"
new "Menu Pembangun"
# _developer\developer.rpym:43
old "Interactive Director (D)"
new "Pengarah Interaktif (D)"
# _developer\developer.rpym:45
old "Reload Game (Shift+R)"
new "Muat Semula Permainan (Shift+R)"
# _developer\developer.rpym:47
old "Console (Shift+O)"
new "Konsol (Shift+O)"
# _developer\developer.rpym:49
old "Variable Viewer"
new "Alat Pemboleh Ubah"
# _developer\developer.rpym:51
old "Image Location Picker"
new "Pemilih Kedudukan Imej"
# _developer\developer.rpym:53
old "Filename List"
new "Senarai Nama Fail"
# _developer\developer.rpym:57
old "Show Image Load Log (F4)"
new "Tunjukkan Log Pemuatan Imej (F4)"
# _developer\developer.rpym:60
old "Hide Image Load Log (F4)"
new "Sembunyikan Log Pemuatan Imej (F4)"
# _developer\developer.rpym:63
old "Image Attributes"
new "Atribut Imej"
# _developer\developer.rpym:90
old "[name] [attributes] (hidden)"
new "[name] [attributes] (disembunyikan)"
# _developer\developer.rpym:94
old "[name] [attributes]"
new "[name] [attributes]"
# _developer\developer.rpym:137
old "Nothing to inspect."
new "Tiada apa untuk diperiksa."
# _developer\developer.rpym:265
old "Return to the developer menu"
new "Kembali ke menu pembangun"
# _developer\developer.rpym:425
old "Rectangle: %r"
new "Segi empat: %r"
# _developer\developer.rpym:430
old "Mouse position: %r"
new "Kedudukan tetikus: %r"
# _developer\developer.rpym:435
old "Right-click or escape to quit."
new "Klik-kanan atau tekan butang Esc untuk keluar."
# _developer\developer.rpym:467
old "Rectangle copied to clipboard."
new "Segi empat disalin ke papan keratan."
# _developer\developer.rpym:470
old "Position copied to clipboard."
new "Kedudukan disalin ke papan keratan."
# _developer\developer.rpym:489
old "Type to filter: "
new "Tapisan: "
# _developer\developer.rpym:617
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Tekstur: [tex_count] ([tex_size_mb:.1f] MB)"
# _developer\developer.rpym:621
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Cache imej: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
# _developer\developer.rpym:631
old "✔ "
new "✔ "
# _developer\developer.rpym:634
old "✘ "
new "✘ "
# _developer\developer.rpym:639
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}✔ imej diramal (baik){/color}\n{color=#fcc}✘ imej tidak diramal (buruk){/color}\n{color=#fff}Seret untuk gerakkannya.{/color}"
# _developer\inspector.rpym:38
old "Displayable Inspector"
new "Pemeriksa Boleh Papar"
# _developer\inspector.rpym:61
old "Size"
new "Saiz"
# _developer\inspector.rpym:65
old "Style"
new "Gaya"
# _developer\inspector.rpym:71
old "Location"
new "Kedudukan"
# _developer\inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "Memeriksa Gaya [displayable_name!q]"
# _developer\inspector.rpym:139
old "displayable:"
new "boleh papar:"
# _developer\inspector.rpym:145
old " (no properties affect the displayable)"
new " (tiada sifat memberi kesan boleh papar)"
# _developer\inspector.rpym:147
old " (default properties omitted)"
new " (sifat lalai disingkirkan)"
# _developer\inspector.rpym:185
old "<repr() failed>"
new "<repr() gagal>"
# _layout\classic_load_save.rpym:170
old "a"
new "a"
# _layout\classic_load_save.rpym:179
old "q"
new "q"
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Menghubungi App Store\nSila tunggu..."
# 00updater.rpy:372
old "The Ren'Py Updater is not supported on mobile devices."
new "Pengemaskini Ren'Py tidak boleh digunakan di peranti mudah alih."
# 00updater.rpy:491
old "An error is being simulated."
new "Sebuah ralat sedang disimulasikan."
# 00updater.rpy:672
old "Either this project does not support updating, or the update status file was deleted."
new "Sama ada projek ini tidak ada fungsi mengemaskini, atau fail status kemas kini telah dipadam."
# 00updater.rpy:686
old "This account does not have permission to perform an update."
new "Akaun ini tidak mempunyai kebenaran untuk mengemaskini."
# 00updater.rpy:689
old "This account does not have permission to write the update log."
new "Akaun ini tidak mempunyai kebenaran untuk menulis log kemas kini."
# 00updater.rpy:716
old "Could not verify update signature."
new "Tidak boleh mengesahkan tandatangan kemas kini."
# 00updater.rpy:991
old "The update file was not downloaded."
new "Fail kemas kini tidak dimuat turun."
# 00updater.rpy:1009
old "The update file does not have the correct digest - it may have been corrupted."
new "Fail kemas kini tidak mempunyai cerna yang betul - mungkin ia telah rosak."
# 00updater.rpy:1065
old "While unpacking {}, unknown type {}."
new "Ketika menyahpadat {}, terdapat jenis tidak diketahui {}."
# 00updater.rpy:1429
old "Updater"
new "Pengemaskini"
# 00updater.rpy:1440
old "This program is up to date."
new "Atur cara ini sudah pun dikemaskini."
# 00updater.rpy:1442
old "[u.version] is available. Do you want to install it?"
new "[u.version] kini tersedia. Adakah anda ingin memasangkan ia?"
# 00updater.rpy:1444
old "Preparing to download the updates."
new "Membuat persediaan memuat turun kemas kini."
# 00updater.rpy:1446
old "Downloading the updates."
new "Sedang memuat turun kemas kini."
# 00updater.rpy:1448
old "Unpacking the updates."
new "Sedang menyahpadat kemas kini."
# 00updater.rpy:1452
old "The updates have been installed. The program will restart."
new "Kemaskini telah dipasang. Atur cara akan dimulakan semula."
# 00updater.rpy:1454
old "The updates have been installed."
new "Kemas kini telah dipasang."
# 00updater.rpy:1456
old "The updates were cancelled."
new "Kemas kini telah dibatalkan."
# 00gallery.rpy:585
old "Image [index] of [count] locked."
new "Imej [index] daripada [count] dikunci."
# 00gallery.rpy:605
old "prev"
new "sebelumnya"
# 00gallery.rpy:606
old "next"
new "seterusnya"
# 00gallery.rpy:607
old "slideshow"
new "persembahan slaid"
# 00gallery.rpy:608
old "return"
new "kembali"
+66
View File
@@ -0,0 +1,66 @@
translate malay strings:
# 00console.rpy:255
old "Press <esc> to exit console. Type help for help.\n"
new "Tekan <esc> untuk keluar konsol. Taip help untuk bantuan.\n"
# 00console.rpy:259
old "Ren'Py script enabled."
new "Skrip Ren'Py dibolehkan."
# 00console.rpy:261
old "Ren'Py script disabled."
new "Skrip Ren'Py dilumpuhkan."
# 00console.rpy:496
old "help: show this help"
new "help: tunjukkan bantuan ini"
# 00console.rpy:501
old "commands:\n"
new "perintah:"
# 00console.rpy:511
old " <renpy script statement>: run the statement\n"
new " <kenyataan skrip renpy>: menjalankan kenyataan tersebut\n"
# 00console.rpy:513
old " <python expression or statement>: run the expression or statement"
new " <ungkapan atau kenyataan python>: menjalankan ungkapan atau kenyataan tersebut"
# 00console.rpy:521
old "clear: clear the console history"
new "clear: kosongkan sejarah konsol"
# 00console.rpy:525
old "exit: exit the console"
new "exit: keluar konsol"
# 00console.rpy:533
old "load <slot>: loads the game from slot"
new "load <slot>: memuatkan permainan daripada slot"
# 00console.rpy:546
old "save <slot>: saves the game in slot"
new "save <slot>: menyimpan permainan ke dalam slot"
# 00console.rpy:557
old "reload: reloads the game, refreshing the scripts"
new "reload: memuatkan semula permainan, menyegarkan semula skrip"
# 00console.rpy:565
old "watch <expression>: watch a python expression"
new "watch <ungkapan>: pantau ungkapan python"
# 00console.rpy:591
old "unwatch <expression>: stop watching an expression"
new "unwatch <ungkapan>: berhenti memantau ungkapan"
# 00console.rpy:622
old "unwatchall: stop watching all expressions"
new "unwatchall: bergenti memantau semua ungkapan"
# 00console.rpy:639
old "jump <label>: jumps to label"
new "jump <label>: lompat ke label"
+214
View File
@@ -0,0 +1,214 @@
translate malay strings:
# 00gltest.rpy:70
old "Renderer"
new "Penerjemahan Grafik"
# 00gltest.rpy:74
old "Automatically Choose"
new "Pilih Secara Automatik"
# 00gltest.rpy:79
old "Force Angle/DirectX Renderer"
new "Paksa Penerjemah Angle/DirectX"
# 00gltest.rpy:83
old "Force OpenGL Renderer"
new "Paksa Penerjemah OpenGL"
# 00gltest.rpy:87
old "Force Software Renderer"
new "Paksa Penerjemah Perisian"
# 00gltest.rpy:93
old "NPOT"
new "NPOT"
# 00gltest.rpy:97
old "Enable"
new "Bolehkan"
# 00gltest.rpy:131
old "Powersave"
new "Jimat Tenaga"
# 00gltest.rpy:145
old "Framerate"
new "Kadar Bingkai"
# 00gltest.rpy:149
old "Screen"
new "Skrin"
# 00gltest.rpy:153
old "60"
new "60"
# 00gltest.rpy:157
old "30"
new "30"
# 00gltest.rpy:163
old "Tearing"
new "Pengoyakan"
# 00gltest.rpy:179
old "Changes will take effect the next time this program is run."
new "Penukaran akan menerima kesan apabila atur cara ini dijalankan semula."
# 00gltest.rpy:213
old "Performance Warning"
new "Amaran Prestasi"
# 00gltest.rpy:218
old "This computer is using software rendering."
new "Komputer ini menggunakan penerjemahan perisian."
# 00gltest.rpy:220
old "This computer is not using shaders."
new "Komputer ini tidak menggunakan pembayang."
# 00gltest.rpy:222
old "This computer is displaying graphics slowly."
new "Komputer ini memaparkan grafik dengan perlahan."
# 00gltest.rpy:224
old "This computer has a problem displaying graphics: [problem]."
new "Komputer ini mempunyai masalah memaparkan grafik: [problem]."
# 00gltest.rpy:229
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "Pemacu grafiknya mungkin ketinggalan zaman atau tidak beroperasi dengan betul. Ini boleh menyebabkan paparan grafik yang perlahan atau tidak betul. Mengemaskini DirectX boleh membaiki masalah ini."
# 00gltest.rpy:231
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "Pemacu grafiknya mungkin ketinggalan zaman atau tidak beroperasi dengan betul. Ini boleh menyebabkan paparan grafik yang perlahan atau tidak betul."
# 00gltest.rpy:236
old "Update DirectX"
new "Kemas Kini DirectX"
# 00gltest.rpy:242
old "Continue, Show this warning again"
new "Teruskan, Tunjukkan amaran ini lagi"
# 00gltest.rpy:246
old "Continue, Don't show warning again"
new "Teruskan, Jangan tunjukkan amaran sudah"
# 00gltest.rpy:264
old "Updating DirectX."
new "Sedang mengemaskini DirectX."
# 00gltest.rpy:268
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "Pemasangan web DirectX telah dimulakan. Ia mungkin bermula diminimumkan dalam bar tugas. Sila ikut arahan yang dipaparkan untuk memasang DirectX."
# 00gltest.rpy:272
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}Nota:{/b} Atur cara web Microsoft's DirectX selalunya akan memasangkan bar alat Bing. Jika anda tidak ingin bar alat ini, sila buang tanda di kotak yang berkenaan."
# 00gltest.rpy:276
old "When setup finishes, please click below to restart this program."
new "Apabila pemasangan selesai, sila klik di bawah untuk memulakan semula atur cara ini."
# 00gltest.rpy:278
old "Restart"
new "Mula Semula"
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Pilih Pad Permainan untuk Ditentuukur"
# 00gamepad.rpy:35
old "No Gamepads Available"
new "Tiada Pad Permainan Tersedia"
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Menentuukur [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Tekan atau gerakkan [kind] [control!r]."
# 00gamepad.rpy:66
old "Skip (A)"
new "Langkau (A)"
# 00gamepad.rpy:69
old "Back (B)"
new "Kembali (B)"
# _errorhandling.rpym:528
old "Open"
new "Buka"
# _errorhandling.rpym:530
old "Opens the traceback.txt file in a text editor."
new "Buka fail traceback.txt dalam penyunting tulisan."
# _errorhandling.rpym:532
old "Copy"
new "Salin"
# _errorhandling.rpym:534
old "Copies the traceback.txt file to the clipboard."
new "Menyalin fail traceback.txt ke papan keratan."
# _errorhandling.rpym:561
old "An exception has occurred."
new "Telah berlakunya pengecualian ralat."
# _errorhandling.rpym:581
old "Rollback"
new "Undur"
# _errorhandling.rpym:583
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Cuba untuk mengundur ke masa sebelumnya, membolehkan anda menyimpan atau memilih pilihan berbeza."
# _errorhandling.rpym:586
old "Ignore"
new "Abai"
# _errorhandling.rpym:590
old "Ignores the exception, allowing you to continue."
new "Abaikan pengecualian ralat, membolehkan anda untuk meneruskan."
# _errorhandling.rpym:592
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Abaikan pengecualian ralat, membolehkan anda untuk meneruskan. Ini selalunya menimbulkan lebih banyak ralat."
# _errorhandling.rpym:596
old "Reload"
new "Muat Semula"
# _errorhandling.rpym:598
old "Reloads the game from disk, saving and restoring game state if possible."
new "Memuatkan semula permainan daripada cakera, menyimpan dan memulihkan keadaan permainan jika boleh."
# _errorhandling.rpym:601
old "Console"
new "Konsol"
# _errorhandling.rpym:603
old "Opens a console to allow debugging the problem."
new "Membuka konsol untuk membolehkan penyahpepijatan masalah."
# _errorhandling.rpym:613
old "Quits the game."
new "Keluar permainan."
# _errorhandling.rpym:637
old "Parsing the script failed."
new "Penghuraian skrip telah gagal."
# _errorhandling.rpym:663
old "Opens the errors.txt file in a text editor."
new "Buka fail errors.txt dalam penyunting tulisan."
# _errorhandling.rpym:667
old "Copies the errors.txt file to the clipboard."
new "Menyalin fail errors.txt ke papan keratan."
+434
View File
@@ -0,0 +1,434 @@
translate malay strings:
# gui.rpy:2
old "## Initialization"
new "## Pengawalan"
# gui.rpy:5
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
new "## Kenyataan init offset dalam fail ini menyebabkan kenyataan dalam fail ini dijalankan sebelum sebarang kenyataan init dalam fail lain."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## Memanggil gui.init menetapkan semula gaya ke nilai lalai yang wajar, dan menetapkan lebar dan tinggi permainan."
# gui.rpy:17
old "## GUI Configuration Variables"
new "## Pemboleh Ubah Tatarajah GUI"
# gui.rpy:21
old "## Colors"
new "## Warna"
# gui.rpy:23
old "## The colors of text in the interface."
new "## Warna tulisan dalam antara muka."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
new "## Warna aksen yang digunakan di seluruh antara muka untuk melabel dan menanda tulisan."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
new "## Warna yang digunakan untuk butang tulisan apabila ia tidak dipilih mahupun dilalukan tetikus."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## Warna kecil itu digunakan untuk tulisan kecil, ia mestilah lebih terang/gelap untuk mencapai kesan yang sama."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
new "## Warna yang digunakan untuk butang dan bar yang dilalukan tetikus."
# 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 "## Warna yang digunakan untuk butang tulisan apabila ianya dipilih tetapi tidak difokuskan. Butang dipilih sekiranya ia skrin semasa atau nilai diutamakan."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
new "## Warna yang digunakan untuk butang tulisan apabila ia tidak boleh dipilih."
# 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 "## Warna digunakan untuk bahagian bar yang belum diisi. Warna ini tidak digunakan secara terus, tetapi digunakan ketika menjana semula fail imej bar."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## Warna yang digunakan untuk tulisan dialog dan pilihan menu."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fon dan Saiz Fon"
# gui.rpy:58
old "## The font used for in-game text."
new "## Fon yang digunakan untuk tulisan di dalam permainan."
# gui.rpy:61
old "## The font used for character names."
new "## Fon yang digunakan untuk nama-nama watak."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## Fon yang digunakan untuk tulisan di luar permainan."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## Saiz untuk tulisan dialog biasa."
# gui.rpy:70
old "## The size of character names."
new "## Saiz untuk nama-nama watak."
# gui.rpy:73
old "## The size of text in the game's user interface."
new "## Saiz tulisan dalam antara muka pengguna permainan."
# gui.rpy:76
old "## The size of labels in the game's user interface."
new "## Saiz label dalam antara muka pengguna permainan."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## Saiz tulisan pada skrin pemberitahuan."
# gui.rpy:82
old "## The size of the game's title."
new "## Saiz tulisan tajuk permainan."
# gui.rpy:86
old "## Main and Game Menus"
new "## Menu Utama dan Permainan"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## Imej yang digunakan untuk menu utama dan permainan."
# gui.rpy:93
old "## Dialogue"
new "## Dialog"
# gui.rpy:95
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## Pemboleh ubah ini mengawal bagaimana dialog dipaparkan di atas skrin sebaris pada sesuatu masa."
# gui.rpy:98
old "## The height of the textbox containing dialogue."
new "## Tinggi kotak tulisan yang mengandungi dialog."
# gui.rpy:101
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 "## Peletakan menegak kotak tulisan di atas skrin. 0.0 di atas, 0.5 di tengah, dan 1.0 di bawah."
# gui.rpy:106
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 "## Peletakan nama watak yang sedang bercakap, relatif kepada kotak tulisan. Nilai boleh jadi nombor bulat piksel dari kiri atau atas, atau 0.5 untuk di tengah."
# gui.rpy:111
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 "## Penjajaran melintang nama watak. Ini boleh jadi 0.0 untuk penjajaran kiri, 0.5 untuk penjajaran tengah, dan 1.0 untuk penjajaran kanan."
# gui.rpy:115
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## Lebar, tinggi, dan sempadan kotak yang mengandungi nama watak, atau None untuk menentukan saiz secara automatik."
# gui.rpy:120
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## Sempadan kotak yang mengandungi nama watak, mengikut susunan kiri, atas, kanan, bawah."
# gui.rpy:124
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Jika ditetapkan kepada True, latar belakang kotak nama akan dijubinkan, jika False, latar belakang kotak nama akan dissesuaikan saiznya."
# gui.rpy:129
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 "## Peletakan dialog relatif kepada kotak tulisan. Nilai boleh jadi nombor bulat piksel dari kiri atau atas dari kotak tulisan, atau 0.5 untuk di tengah."
# gui.rpy:135
old "## The maximum width of dialogue text, in pixels."
new "## Lebar maksimum tulisan dialog, dalam piksel."
# gui.rpy:138
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 "## Penjajaran melintang tulisan dialog. Ini boleh jadi 0.0 untuk penjajaran kiri, 0.5 untuk penjajaran tengah, dan 1.0 untuk penjajaran kanan."
# gui.rpy:143
old "## Buttons"
new "## Butang"
# gui.rpy:145
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## Pemboleh ubah ini, beserta fail imej dalam gui/button, mengawal aspek mana butang akan dipaparkan."
# gui.rpy:148
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## Lebar dan tinggi butang, dalam piksel. Jika ditetapkan kepada None, Ren'Py akan mengira saiz sendiri."
# gui.rpy:152
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## Sempadan di setiap sisi butang, dalam susunan kiri, atas, kanan, bawah."
# gui.rpy:155
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## Jika ditetapkan kepada True, latar belakang imej akan dijubinkan. Jika False, latar belakang imej akan disesuaikan saiznya secara linear."
# gui.rpy:159
old "## The font used by the button."
new "## Fon yang digunakan pada butang."
# gui.rpy:162
old "## The size of the text used by the button."
new "## Saiz untuk tulisan yang digunakan pada butang."
# gui.rpy:165
old "## The color of button text in various states."
new "## Warna tulisan butang dalam pelbagai keadaan."
# gui.rpy:171
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
new "## Penjajaran melintang tulisan butang. (0.0 untuk kiri, 0.5 untuk tengah, 1.0 untuk kanan)."
# gui.rpy:176
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 "## Pemboleh ubah ini mengatasi tetapan untuk pelbagai jenis butang. Sila lihat pendokumenan gui untuk pelbagai jenis butang yang ada, dan apa fungsi setiap satunya."
# gui.rpy:180
old "## These customizations are used by the default interface:"
new "## Pengubahsuaian ini digunakan di antara muka lalai:"
# gui.rpy:195
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 "## Anda juga boleh menambah ubah suai anda sendiri, dengan menambah pemboleh ubah yang dinamakan dengan betul. Contohnya, anda boleh nyahkomen baris di bawah untuk menetapkan lebar butang navigasi."
# gui.rpy:202
old "## Choice Buttons"
new "## Butang Pilihan"
# gui.rpy:204
old "## Choice buttons are used in the in-game menus."
new "## Butang pilihan digunakan pada menu dalam permainan."
# gui.rpy:217
old "## File Slot Buttons"
new "## Butang Slot Fail"
# gui.rpy:219
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 "## Butang slot fail ialah butang jenis istimewa. Ia mengandungi imej kecil, dan tulisan yang menerangkan kandungan slot simpanan. Sebuah slot simpanan menggunakan fail imej dalam gui/button, seperti butang-butang jenis lain."
# gui.rpy:223
old "## The save slot button."
new "## Butang slot simpan."
# gui.rpy:233
old "## The width and height of thumbnails used by the save slots."
new "## Lebar dan tinggi imej kecil yang digunakan di slot simpan."
# gui.rpy:237
old "## The number of columns and rows in the grid of save slots."
new "## Jumlah lajur dan baris dalam grid slot simpan."
# gui.rpy:242
old "## Positioning and Spacing"
new "## Peletakan dan Penjarakan"
# gui.rpy:244
old "## These variables control the positioning and spacing of various user interface elements."
new "## Pemboleh ubah ini mengawal peletakan dan penjarakan pelbagai unsur antara muka pengguna."
# gui.rpy:247
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## Kedudukan sisi kiri butang navigasi, relatif kepada sisi kiri skrin."
# gui.rpy:251
old "## The vertical position of the skip indicator."
new "## Kedudukan menegak penunjuk langkau."
# gui.rpy:254
old "## The vertical position of the notify screen."
new "## Kedudukan menegak skrin pemberitahuan."
# gui.rpy:257
old "## The spacing between menu choices."
new "## Penjarakan di antara pelbagai pilihan menu."
# gui.rpy:260
old "## Buttons in the navigation section of the main and game menus."
new "## Butang dalam bahagian navigasi di menu utama dan permainan."
# gui.rpy:263
old "## Controls the amount of spacing between preferences."
new "## Mengawal jumlah jarak di antara keutamaan."
# gui.rpy:266
old "## Controls the amount of spacing between preference buttons."
new "## Mengawal jumlah jarak di antara butang keutamaan."
# gui.rpy:269
old "## The spacing between file page buttons."
new "## Jarak di antara butang halaman fail."
# gui.rpy:272
old "## The spacing between file slots."
new "## Jarak di antara slot fail."
# gui.rpy:275
old "## The position of the main menu text."
new "## Kedudukan tulisan menu utama."
# gui.rpy:279
old "## Frames"
new "## Bingkai"
# gui.rpy:281
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## Pemboleh ubah ini mengawal rupa bingkai yang boleh mengandungi komponen antara muka apabila tindihan atas atau tetingkap tidak wujud."
# gui.rpy:284
old "## Generic frames."
new "## Bingkai umum."
# gui.rpy:287
old "## The frame that is used as part of the confirm screen."
new "## Bingkai yang digunakan sebagai sebahagian skrin pengesahan."
# gui.rpy:290
old "## The frame that is used as part of the skip screen."
new "## Bingkai yang digunakan sebagai sebahagian skrin langkau."
# gui.rpy:293
old "## The frame that is used as part of the notify screen."
new "## Bingkai yang digunakan sebagai sebahagian skrin pemberitahuan."
# gui.rpy:296
old "## Should frame backgrounds be tiled?"
new "## Adakah latar belakang bingkai patut dijubinkan?"
# gui.rpy:300
old "## Bars, Scrollbars, and Sliders"
new "## Bar, Bar Tatal, dan Lungsur"
# gui.rpy:302
old "## These control the look and size of bars, scrollbars, and sliders."
new "## Ini mengawal rupa dan saiz bar, bar tatal, dan lungsur."
# gui.rpy:304
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
new "## GUI lalai hanya menggunakan lungsur dan bar tatal menegak. Semua bar lain hanya digunakan dalam skrin ditulis oleh para pencipta."
# gui.rpy:307
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Tinggi bar melintang, bar tatal, dan lungsur. Lebar bar menegak, bar tatal, dan lungsur."
# gui.rpy:313
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## Tetapkan True jika imej bar patut dijubinkan. Tetapkan False jika mereka patut disesuaikan saiz secara linear."
# gui.rpy:318
old "## Horizontal borders."
new "## Sempadan melintang."
# gui.rpy:323
old "## Vertical borders."
new "## Sempadan menegak."
# gui.rpy:328
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## Apa nak dibuat dengan bar tatal yang tidak boleh ditatalkan dalam gui. \"hide\" menyembunyikan mereka, manakala None menunjukkan mereka."
# gui.rpy:333
old "## History"
new "## Sejarah"
# gui.rpy:335
old "## The history screen displays dialogue that the player has already dismissed."
new "## Skrin sejarah memaparkan dialog yang pemain telah tolak tepi."
# gui.rpy:337
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## Jumlah blok sejarah dialog yang Ren'Py akan simpan."
# gui.rpy:340
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## Tinggi untuk entri skrin sejarah, atau tetapkan kepada None untuk membiarkan tinggi dikira sendiri dengan mengorbankan prestasi."
# gui.rpy:344
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Kedudukan, lebar, dan penjajaran label yang memberikan nama kepada watak yang sedang bercakap."
# gui.rpy:351
old "## The position, width, and alignment of the dialogue text."
new "## Kedudukan, lebar, dan penjajaran tulisan dialog."
# gui.rpy:358
old "## NVL-Mode"
new "## Mod NVL"
# gui.rpy:360
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## Skrin mod NVL menunjukkan dialog yang dicakapkan oleh watak mod NVL."
# gui.rpy:362
old "## The borders of the background of the NVL-mode background window."
new "## Sempadan latar belakang tetingkap latar mod NVL."
# gui.rpy:365
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 "## Jumlah entri mod NVL maksimum yang Ren'Py akan paparkan. Apabila lebih banyak entri akan ditunjukkan, entri paling lama akan dibuang."
# gui.rpy:369
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## Tinggi entri mod NVL. Tetapkan ini kepada None untuk membuatkan entri melaraskan tinggi secara dinamik."
# gui.rpy:373
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## Jarak di antara entri mod NVL apabila gui.nvl_height ditetapkan kepada None, dan di antara entri mod NVL dan menu mod NVL."
# gui.rpy:390
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## Kedudukan, lebar, dan penjajaran tulisan nvl_thought (tulisan yang dicakapkan oleh watak nvl_narrator)."
# gui.rpy:397
old "## The position of nvl menu_buttons."
new "## Kedudukan menu_buttons nvl."
# gui.rpy:401
old "## Localization"
new "## Terjemahan"
# gui.rpy:403
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 "## Ini mengawal di mana baris pemisah dibenarkan. Lalainya ia sesuai untuk semua bahasa. Senarai nilai yang ada boleh dijumpai di https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# gui.rpy:411
old "## Mobile devices"
new "## Peranti mudah alih"
# gui.rpy:416
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## Ini menambah saiz butang cepat untuk membuatkan mereka lebih mudah disentuh pada tablet dan telefon."
# gui.rpy:422
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## Ini menukar saiz dan penjarakan pelbagai unsur GUI untuk memastikan mereka lebih mudah dilihat pada telefon."
# gui.rpy:426
old "## Font sizes."
new "## Saiz fon."
# gui.rpy:434
old "## Adjust the location of the textbox."
new "## Laras kedudukan kotak tulisan."
# gui.rpy:440
old "## Change the size and spacing of various things."
new "## Tukar saiz dan penjarakan pelbagai benda."
# gui.rpy:453
old "## File button layout."
new "## Tataletak butang fail."
# gui.rpy:457
old "## NVL-mode."
new "## Mod NVL."
File diff suppressed because it is too large Load Diff
+202
View File
@@ -0,0 +1,202 @@
translate malay strings:
# options.rpy:1
old "## This file contains options that can be changed to customize your game."
new "## Fail ini mengandungi pilihan yang boleh ditukar untuk mengubahsuai permainan anda."
# 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 "## Baris bermula dengan dua tanda '#' ialah komen, dan anda tidak patut menyahkomen mereka. Baris bermula dengan satu tanda '#' ialah kod yang dikomenkan, dan anda mungkin ingin menyahkomen mereka apabila perlu."
# options.rpy:10
old "## Basics"
new "## Asas"
# 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 "## Nama permainan yang boleh dibaca manusia. Ini digunakan untuk menetapkan tajuk tetingkap lalai, dan ditunjukkan dalam antara muka dan laporan ralat."
# options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## Tanda _() di sekeliling rentetan menandakan ia layak untuk diterjemah."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "GUI Lalai Ren'Py 7"
# 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 "## Menentukan sama ada tajuk yang diberikan di atas ditunjukkan pada skrin menu utama. Tetapkan kepada False untuk menyembunyikan tajuk."
# options.rpy:26
old "## The version of the game."
new "## Versi permainan ini."
# 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 "## Tulisan yang diletakkan pada skrin perihalan permainan. Letakkan tulisan di antara tanda petikan ganda tiga, dan biarkan baris kosong di antara perenggan."
# options.rpy:38
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## Nama pendek untuk permainan yang digunakan untuk boleh laku dan direktori dalam pengedaran yang dibina. Ini mestilah aksara ASCII sahaja, dan tidak boleh ada selang, titik bertindih, atau koma bertindih."
# options.rpy:45
old "## Sounds and music"
new "## Bunyi dan muzik"
# options.rpy:47
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 "## Tiga pemboleh ubah ini mengawal pengadun mana yang ditunjukkan kepada pemain secara lalainya. Menetapkan salah satu daripadanya kepada False akan menyembunyikan pengadun yang berkaitan."
# options.rpy:56
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
new "## Untuk membolehkan pengguna memainkan bunyi percubaan untuk saluran bunyi atau suara, nyahkomen satu baris di bawah dan gunakannya untuk menetapkan bunyi sampel untuk dimainkan."
# options.rpy:63
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
new "## Nyahkomen baris di bawah untuk menetapkan fail audio yang akan dimainkan ketika pemain berada di menu utama. Fail ini akan terus dimainkan selepas permainan bermula, sehingga ia dihentikan atau fail lain dimainkan."
# options.rpy:70
old "## Transitions"
new "## Peralihan"
# options.rpy:72
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
new "## Pemboleh ubah ini menetapkan peralihan yang akan digunakan apabila berlakunya acara tertentu. Setiap pemboleh ubah patut ditetapkan kepada sejenis peralihan, atau kepada None untuk menunjukkan tiada peralihan patut digunakan."
# options.rpy:76
old "## Entering or exiting the game menu."
new "## Masuk atau keluar menu permainan."
# options.rpy:82
old "## Between screens of the game menu."
new "## Di antara skrin berbeza di menu permainan."
# options.rpy:87
old "## A transition that is used after a game has been loaded."
new "## Peralihan yang digunakan selepas permainan dimuatkan."
# options.rpy:92
old "## Used when entering the main menu after the game has ended."
new "## Digunakan ketika memasuki menu utama selepas permainan tamat."
# options.rpy:97
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
new "## Pemboleh ubah untuk menetapkan peralihan yang digunakan apabila permainan yang dimulakan tidak wujud. Sebaliknya, gunakan dengan kenyataan selepas menunjukkan adegan awal."
# options.rpy:102
old "## Window management"
new "## Pengurusan tetingkap"
# options.rpy:104
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
new "## Ini mengawal apabila tetingkap dialog dipaparkan. Jika ditetapkan kepada \"show\", ia akan sentiasa dipaparkan. Jika \"hide\", ia hanya dipaparkan apabila ada dialog. Jika \"auto\", tetingkap disembunyikan sebelum kenyataan adegan dan ditunjukkan semula selepas dialog dipaparkan."
# options.rpy:109
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## Selepas permainan dimulakan, ini boleh ditukar dengan kenyataan \"window show\", \"window hide\", dan \"window auto\"."
# options.rpy:115
old "## Transitions used to show and hide the dialogue window"
new "## Peralihan yang digunakan untuk menunjukkan dan menyembunyikan tetingkap dialog"
# options.rpy:121
old "## Preference defaults"
new "## Lalai keutamaan"
# options.rpy:123
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Mengawal kelajuan lalai tulisan. Nilai lalai, 0, ialah tiada had (keluar semua serentak), manakala nombor lain ialah jumlah aksara per saat untuk ditulis."
# options.rpy:129
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## Lengah masa bergerak-sendiri yang lalai. Nombor lebih besar menyebabkan lengah lebih lama, dengan julat yang sah dari 0 hingga 30."
# options.rpy:135
old "## Save directory"
new "## Direktori simpan"
# options.rpy:137
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
new "## Mengawal tempat khusus-platform yang Ren'Py akan letakkan fail simpan untuk permainan ini. Fail simpan akan diletakkan di:"
# options.rpy:140
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
# options.rpy:142
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
# options.rpy:144
old "## Linux: $HOME/.renpy/<config.save_directory>"
new "## Linux: $HOME/.renpy/<config.save_directory>"
# options.rpy:146
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
new "## Secara umumnya, ini tidak patut ditukar, namun jika perlu ditukar, ia mestilah rentetan literal dan bukannya ungkapan."
# options.rpy:152
old "## Icon"
new "## Ikon"
# options.rpy:154
old "## The icon displayed on the taskbar or dock."
new "## Ikon dipaparkan di bar tugas atau dok."
# options.rpy:159
old "## Build configuration"
new "## Tatarajah pembinaan"
# options.rpy:161
old "## This section controls how Ren'Py turns your project into distribution files."
new "## Bahagian ini mengawal bagaimana Ren'Py menukarkan projek anda menjadi fail pengedaran."
# options.rpy:166
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## Fungsi di bawah mengambil corak fail. Corak fail tidak sensitif huruf, dan dipadankan dengan haluan relatif kepada direktori asas, dengan dan tanpa tanda pendahuluan /. Jika pelbagai corak terpadan, padanan pertama digunakan."
# options.rpy:171
old "## In a pattern:"
new "## Dalam padanan:"
# options.rpy:173
old "## / is the directory separator."
new "## / ialah pemisah direktori."
# options.rpy:175
old "## * matches all characters, except the directory separator."
new "## * padan semua aksara, kecuali pemisah direktori."
# options.rpy:177
old "## ** matches all characters, including the directory separator."
new "## ** padan semua aksara, termasuk pemisah direktori."
# options.rpy:179
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## Contohnya, \"*.txt\" padan dengan fail txt dalam direktori asas, \"game/**.ogg\" padan dengan fail ogg dalam direktori game atau mana-mana subdirektorinya, dan \"**.psd\" padan dengan fail psd di mana-mana dalam projek."
# options.rpy:183
old "## Classify files as None to exclude them from the built distributions."
new "## Klasifikasikan fail sebagai None untuk mengecualikan mereka daripada pengedaran yang dibina."
# options.rpy:191
old "## To archive files, classify them as 'archive'."
new "## Untuk mengarkib fail, klasifikasikan mereka sebagai 'archive'."
# options.rpy:196
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
new "## Fail yang padan dengan corak pendokumenan akan dipenduakan dalam binaan aplikasi Mac, jadi mereka muncul dalam kedua-dua aplikasi dan fail zip."
# options.rpy:202
old "## Set this to a string containing your Apple Developer ID Application to enable codesigning on the Mac. Be sure to change it to your own Apple-issued ID."
new "## Tetapkan ini kepada rentetan mengandungi Aplikasi ID Pembangun Apple (Apple Developer ID Application) anda untuk membolehkan perekaan bersama di Mac. Pastikan untuk menukarnya kepada ID Apple anda sendiri."
# options.rpy:209
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 "## Kunci lesen Google Play diperlukan untuk memuat turun fail pengembangan dan melakukan pembelian dalam aplikasi. Ia boleh dijumpai di halaman \"Services & APIs\" di konsol pembangun Google Play."
# options.rpy:216
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## Nama pengguna dan nama projek yang dikaitkan dengan projek itch.io, dipisahkan dengan tanda palang sendeng (/)."
+674
View File
@@ -0,0 +1,674 @@
translate malay strings:
# screens.rpy:9
old "## Styles"
new "## Gaya"
# screens.rpy:81
old "## In-game screens"
new "## Skrin dalam permainan"
# screens.rpy:85
old "## Say screen"
new "## Skrin sebutan"
# screens.rpy:87
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## Skrin sebutan digunakan untuk memaparkan dialog kepada pemain. Ia mengambil dua parameter, who ialah nama watak yang bercakap, dan what ialah tulisan untuk dipaparkan. (Parameter who boleh ditetapkan kepada None jika tiada nama diberikan.)"
# screens.rpy:92
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
new "## Skrin ini mesti mencipta tulisan yang boleh dipaparkan dengan id \"what\", kerana Ren'Py menggunakan ini untuk mengurus paparan tulisan. Ia juga boleh mencipta paparan dengan id \"who\" dan id \"window\" untuk menggunakan sifat gaya."
# screens.rpy:96
old "## https://www.renpy.org/doc/html/screen_special.html#say"
new "## https://www.renpy.org/doc/html/screen_special.html#say"
# 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 "## Jika ada imej sampingan, paparkan ia di atas tulisan. Jangan paparkan ia pada varian telefon - ia tidak cukup ruang."
# screens.rpy:120
old "## Make the namebox available for styling through the Character object."
new "## Buatkan kotak nama boleh digayakan melalui objek watak (Character)."
# screens.rpy:164
old "## Input screen"
new "## Skrin input"
# screens.rpy:166
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## Skrin ini digunakan untuk memaparkan renpy.input. Parameter prompt digunakan untuk memberikan prom tulisan."
# screens.rpy:169
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## Skrin ini mesti mencipta input yang boleh dipaparkan dengan id \"input\" untuk menerima pelbagai parameter input."
# 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"
# screens.rpy:199
old "## Choice screen"
new "## Skrin pilihan"
# screens.rpy:201
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 "## Skrin ini digunakan untuk memaparkan pilihan dalam permainan yang dipersembahkan melalui kenyataan menu. Satu-satunya parameter, items, ialah senarai objek, setiap satunya dengan medan keterangan dan medan perbuatan."
# 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"
# screens.rpy:215
old "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
new "## Apabila ini ditetapkan kepada true, keterangan menu akan disebut oleh tukang cerita. Apabila false, keterangan menu akan dipaparkan sebagai butang kosong."
# screens.rpy:238
old "## Quick Menu screen"
new "## Skrin Menu Cepat"
# screens.rpy:240
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## Menu cepat dipaparkan dalam permainan untuk menyediakan capaian mudah ke menu luar permainan."
# screens.rpy:245
old "## Ensure this appears on top of other screens."
new "## Pastikan ini muncuk di atas skrin-skrin lain."
# screens.rpy:256
old "Back"
new "Kembali"
# screens.rpy:257
old "History"
new "Sejarah"
# screens.rpy:258
old "Skip"
new "Langkau"
# screens.rpy:259
old "Auto"
new "Auto"
# screens.rpy:260
old "Save"
new "Simpan"
# screens.rpy:261
old "Q.Save"
new "C.Simpan"
# screens.rpy:262
old "Q.Load"
new "C.Muat"
# screens.rpy:263
old "Prefs"
new "Keutamaan"
# screens.rpy:266
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
new "## Kod ini memastikan skrin quick_menu dipaparkan dalam permainan, apabila pemain tidak menyembunyikan antara muka secara khusus."
# screens.rpy:284
old "## Main and Game Menu Screens"
new "## Skrin Menu Utama dan Permainan"
# screens.rpy:287
old "## Navigation screen"
new "## Skrin Navigasi"
# screens.rpy:289
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
new "## Skrin ini disertakan dalam menu utama dan permainan, dan menyediakan navigasi ke menu lain, dan untuk memulakan permainan."
# screens.rpy:304
old "Start"
new "Mula"
# screens.rpy:312
old "Load"
new "Muat"
# screens.rpy:314
old "Preferences"
new "Keutamaan"
# screens.rpy:318
old "End Replay"
new "Tamatkan Ulang Tayang"
# screens.rpy:322
old "Main Menu"
new "Menu Utama"
# screens.rpy:324
old "About"
new "Perihal"
# screens.rpy:328
old "## Help isn't necessary or relevant to mobile devices."
new "## Bantuan tidak diperlukan atau sesuai untuk peranti mudah alih."
# screens.rpy:329
old "Help"
new "Bantuan"
# screens.rpy:331
old "## The quit button is banned on iOS and unnecessary on Android."
new "## Butang keluar tidak dibenarkan di iOS dan tidak diperlukan di Android."
# screens.rpy:332
old "Quit"
new "Keluar"
# screens.rpy:346
old "## Main Menu screen"
new "## Skrin Menu Utama"
# screens.rpy:348
old "## Used to display the main menu when Ren'Py starts."
new "## Digunakan untuk memaparkan menu utama apabila Ren'Py dimulakan."
# screens.rpy:350
old "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
new "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
# screens.rpy:354
old "## This ensures that any other menu screen is replaced."
new "## Ini memastikan sebarang skrin menu lain digantikan."
# screens.rpy:361
old "## This empty frame darkens the main menu."
new "## Bingkai kosong ini menggelapkan menu utama."
# screens.rpy:365
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## Kenyataan use memasukkan skrin lain ke dalam skrin ini. Kandungan sebenar menu utama ada dalam skrin navigasi."
# screens.rpy:408
old "## Game Menu screen"
new "## Skrin Menu Permainan"
# screens.rpy:410
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 "## Ini meletakkan struktur biasa asas untuk skrin menu permainan. Ia dipanggil dengan tajuk skrin, dan memaparkan latar belakang, tajuk, dan navigasi."
# screens.rpy:413
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 "## Parameter tatal boleh jadi None, atau salah satu dari \"viewport\" atau \"vpgrid\". Apabila skrin ini bertujuan untuk digunakan dengan satu atau lebih anak, yang mana mereka ditransklusikan (diletakkan) ke dalamnya."
# screens.rpy:431
old "## Reserve space for the navigation section."
new "## Menyimpan ruang untuk bahagian navigasi."
# screens.rpy:473
old "Return"
new "Kembali"
# screens.rpy:536
old "## About screen"
new "## Skrin perihal"
# screens.rpy:538
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## Skrin ini memberi penghargaan dan maklumat hak cipta berkaitan permainan dan Ren'Py."
# screens.rpy:541
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
new "## Tiada apa istimewa dengan skrin ini, dan sebab itu ia dikekalkan sebagai contoh cara membuat skrin sendiri."
# screens.rpy:548
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 "## Kenyataan use ini memasukkan skrin game_menu ke dalam skrin ini. Anak vbox kemudiannya dimasukkan ke dalam port pandang dalam skrin game_menu."
# screens.rpy:558
old "Version [config.version!t]\n"
new "Versi [config.version!t]\n"
# screens.rpy:560
old "## gui.about is usually set in options.rpy."
new "## gui.about selalunya ditetapkan di options.rpy."
# screens.rpy:564
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Dibuat menggunakan {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# screens.rpy:567
old "## This is redefined in options.rpy to add text to the about screen."
new "## Benda ini ditakrifkan semula di options.rpy untuk menambah tulisan ke skrin perihalan."
# screens.rpy:579
old "## Load and Save screens"
new "## Muat dan Simpan skrin"
# screens.rpy:581
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 "## Skrin-skrin ini bertanggungjawab untuk membolehkan pemain menyimpan dan memuatkan permainan. Memandangkan mereka berkongsi hampir semua benda, kedua-duanya dilaksanakan dengan cara skrin ketiga, file_slots."
# screens.rpy:585
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
new "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
# screens.rpy:604
old "Page {}"
new "Halaman {}"
# screens.rpy:604
old "Automatic saves"
new "Simpan automatik"
# screens.rpy:604
old "Quick saves"
new "Simpan cepat"
# screens.rpy:610
old "## This ensures the input will get the enter event before any of the buttons do."
new "## Ini memastikan input mendapat acara masuk sebelum sebarang butang lain."
# screens.rpy:614
old "## The page name, which can be edited by clicking on a button."
new "## Nama halaman, yang boleh disunting dengan menekan butang."
# screens.rpy:626
old "## The grid of file slots."
new "## Grid slot fail."
# screens.rpy:646
old "{#file_time}%A, %B %d %Y, %H:%M"
new "{#file_time}%A, %d %B %Y, %H:%M"
# screens.rpy:646
old "empty slot"
new "slot kosong"
# screens.rpy:654
old "## Buttons to access other pages."
new "## Butang untuk mencapai halaman lain."
# screens.rpy:663
old "<"
new "<"
# screens.rpy:666
old "{#auto_page}A"
new "{#auto_page}A"
# screens.rpy:669
old "{#quick_page}Q"
new "{#quick_page}Q"
# screens.rpy:671
old "## range(1, 10) gives the numbers from 1 to 9."
new "## range(1, 10) memberikan nombor dari 1 hingga 9."
# screens.rpy:675
old ">"
new ">"
# screens.rpy:710
old "## Preferences screen"
new "## Skrin keutamaan"
# screens.rpy:712
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## Skrin keutamaan membolehkan pemain untuk menatarajah permainan agar lebih selesa dengan diri mereka."
# screens.rpy:715
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
new "## https://www.renpy.org/doc/html/screen_special.html#preferences"
# screens.rpy:732
old "Display"
new "Paparan"
# screens.rpy:733
old "Window"
new "Tetingkap"
# screens.rpy:734
old "Fullscreen"
new "Skrin Penuh"
# screens.rpy:738
old "Rollback Side"
new "Bahagian Undur"
# screens.rpy:739
old "Disable"
new "Lumpuhkan"
# screens.rpy:740
old "Left"
new "Kiri"
# screens.rpy:741
old "Right"
new "Kanan"
# screens.rpy:746
old "Unseen Text"
new "Teks Belum Lihat"
# screens.rpy:747
old "After Choices"
new "Lepas Pilihan"
# screens.rpy:748
old "Transitions"
new "Lepas Peralihan"
# screens.rpy:750
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Vbox tambahan jenis \"radio_pref\" atau \"check_pref\" boleh ditambah di sini, untuk menambah keutamaan ditakrifkan oleh pencipta permainan."
# screens.rpy:761
old "Text Speed"
new "Kelajuan Tulisan"
# screens.rpy:765
old "Auto-Forward Time"
new "Masa untuk Gerak Sendiri"
# screens.rpy:772
old "Music Volume"
new "Kekuatan Muzik"
# screens.rpy:779
old "Sound Volume"
new "Kekuatan Bunyi"
# screens.rpy:785
old "Test"
new "Cuba"
# screens.rpy:789
old "Voice Volume"
new "Kekuatan Suara"
# screens.rpy:800
old "Mute All"
new "Bisukan SEMUA"
# screens.rpy:876
old "## History screen"
new "## Skrin Sejarah"
# screens.rpy:878
old "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
new "## Ini skrin yang memaparkan sejarah dialog kepada pemain. Walaupun tiada apa yang istimewa dengan skrin ini, ia mempunyai capaian ke sejarah dialog dalam _history_list."
# screens.rpy:882
old "## https://www.renpy.org/doc/html/history.html"
new "## https://www.renpy.org/doc/html/history.html"
# screens.rpy:888
old "## Avoid predicting this screen, as it can be very large."
new "## Mengelakkan ramalan skrin ini, kerana ia boleh jadi sangat besar."
# screens.rpy:899
old "## This lays things out properly if history_height is None."
new "## Ini meletakkan semua benda dengan elok jika history_height ditetapkan ke None."
# screens.rpy:908
old "## Take the color of the who text from the Character, if set."
new "## Mengambil warna tulisan 'who' dari objek watak (Character), jika ia ditetapkan."
# screens.rpy:916
old "The dialogue history is empty."
new "Sejarah dialog kosong."
# screens.rpy:919
old "## This determines what tags are allowed to be displayed on the history screen."
new "## Ini menentukan tag apa yang dibenarkan untuk dipaparkan di skrin sejarah."
# screens.rpy:966
old "## Help screen"
new "## Skrin Bantuan"
# screens.rpy:968
old "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
new "## Skrin yang memberikan maklumat berkaitan pengikatan kekunci dan tetikus. Ia menggunakan skrin lain (keyboard_help, mouse_help, dan gamepad_help) untuk memaparkan bantuan sebenar."
# screens.rpy:987
old "Keyboard"
new "Papan Kekunci"
# screens.rpy:988
old "Mouse"
new "Tetikus"
# screens.rpy:991
old "Gamepad"
new "Pad Permainan"
# screens.rpy:1004
old "Enter"
new "Enter"
# screens.rpy:1005
old "Advances dialogue and activates the interface."
new "Menggerakkan dialog dan mengaktifkan antara muka."
# screens.rpy:1008
old "Space"
new "Space"
# screens.rpy:1009
old "Advances dialogue without selecting choices."
new "Menggerakkan dialog tanpa memilih pilihan."
# screens.rpy:1012
old "Arrow Keys"
new "Kekunci Anak Panah"
# screens.rpy:1013
old "Navigate the interface."
new "Melayar antara muka."
# screens.rpy:1016
old "Escape"
new "Escape"
# screens.rpy:1017
old "Accesses the game menu."
new "Mencapai menu permainan."
# screens.rpy:1020
old "Ctrl"
new "Ctrl"
# screens.rpy:1021
old "Skips dialogue while held down."
new "Langkau dialog apabila ditekan."
# screens.rpy:1024
old "Tab"
new "Tab"
# screens.rpy:1025
old "Toggles dialogue skipping."
new "Menogol langkauan dialog."
# screens.rpy:1028
old "Page Up"
new "Page Up"
# screens.rpy:1029
old "Rolls back to earlier dialogue."
new "Bergerak ke dialog sebelumnya."
# screens.rpy:1032
old "Page Down"
new "Page Down"
# screens.rpy:1033
old "Rolls forward to later dialogue."
new "Bergerak ke dialog seterusnya."
# screens.rpy:1037
old "Hides the user interface."
new "Menyembunyikan antara muka pengguna."
# screens.rpy:1041
old "Takes a screenshot."
new "Mengambil tangkap skrin."
# screens.rpy:1045
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Menogol {a=https://www.renpy.org/l/voicing}penyuaraan sendiri{/a} yang membantu."
# screens.rpy:1051
old "Left Click"
new "Klik Kiri"
# screens.rpy:1055
old "Middle Click"
new "Klik Tengah"
# screens.rpy:1059
old "Right Click"
new "Klik Kanan"
# screens.rpy:1063
old "Mouse Wheel Up\nClick Rollback Side"
new "Tatal Ke Atas\nKlik Sisi Undur"
# screens.rpy:1067
old "Mouse Wheel Down"
new "Tatal Ke Bawah"
# screens.rpy:1074
old "Right Trigger\nA/Bottom Button"
new "Picu Kanan\nA/Butang Bawah"
# screens.rpy:1078
old "Left Trigger\nLeft Shoulder"
new "Picu Kiri\nBahu Kiri (L1)"
# screens.rpy:1082
old "Right Shoulder"
new "Bahu Kanan (R1)"
# screens.rpy:1087
old "D-Pad, Sticks"
new "D-Pad (Butang Arah), Kayu Bedik"
# screens.rpy:1091
old "Start, Guide"
new "Butang Start, Guide"
# screens.rpy:1095
old "Y/Top Button"
new "Y/Butang Atas"
# screens.rpy:1098
old "Calibrate"
new "Tentuukur"
# screens.rpy:1126
old "## Additional screens"
new "## Skrin tambahan"
# screens.rpy:1130
old "## Confirm screen"
new "## Skrin pengesahan"
# screens.rpy:1132
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## Skrin pengesahan dipanggil apabila Ren'Py ingin bertanya pemain soalan ya atau tidak."
# 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"
# screens.rpy:1139
old "## Ensure other screens do not get input while this screen is displayed."
new "## Memastikan skrin-skrin lain tidak mendapat input apabila skrin ini dipaparkan."
# screens.rpy:1163
old "Yes"
new "Ya"
# screens.rpy:1164
old "No"
new "Tidak"
# screens.rpy:1166
old "## Right-click and escape answer \"no\"."
new "## Klik-kanan dan keluar menjawab \"tidak\"."
# screens.rpy:1193
old "## Skip indicator screen"
new "## Skrin Penunjuk Langkau"
# screens.rpy:1195
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## Skrin skip_indicator dipaparkan untuk menandakan pelangkauan sedang dilakukan."
# screens.rpy:1198
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
new "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
# screens.rpy:1210
old "Skipping"
new "Melangkau"
# screens.rpy:1217
old "## This transform is used to blink the arrows one after another."
new "## Peralihan ini digunakan untuk mengerdipkan anak panah satu selepas satu."
# screens.rpy:1244
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
new "## Kami perlu menggunakan fon yang mempunyai glif bernama BLACK RIGHT-POINTING SMALL TRIANGLE (segi tiga kecil hitam menunjuk ke kanan) di dalamnya."
# screens.rpy:1249
old "## Notify screen"
new "## Skrin Pemberitahuan"
# screens.rpy:1251
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 "## Skrin pemberitahuan digunakan untuk menunjukkan mesej kepada pemain. (Contohnya, apabila permainan disimpan cepat atau tangkap skrin telah diambil.)"
# screens.rpy:1254
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
new "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
# screens.rpy:1288
old "## NVL screen"
new "## Skrin NVL"
# screens.rpy:1290
old "## This screen is used for NVL-mode dialogue and menus."
new "## Skrin ini digunakan untuk dialog dan menu mod NVL."
# 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"
# screens.rpy:1303
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Memaparkan dialog sama ada dalam vpgrid atau vbox."
# screens.rpy:1316
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 "## Memaparkan menu, sekiranya diberi. Menu mungkin dipaparkan dengan salah jika config.narrator_menu ditetapkan ke True, seperti di atas."
# screens.rpy:1346
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## Ini mengawal jumlah maksimum entri mod NVL yang boleh dipaparkan dalam sesuatu masa."
# screens.rpy:1408
old "## Mobile Variants"
new "## Varian Mudah Alih"
# screens.rpy:1415
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 "## Memandangkan tetikus tidak semestinya ada, kami menggantikan menu cepat dengan versi yang menggunakan sedikit butang dan butang lebih besar agar lebih mudah disentuh."
# screens.rpy:1431
old "Menu"
new "Menu"
+33
View File
@@ -0,0 +1,33 @@
# Skrip permainan masuk ke dalam fail ini.
# Isytiharkan watak yang digunakan dalam permainan ini.
# Argumen color mewarnakan nama watak.
define e = Character("Eileen")
# Permainan bermula di sini.
label start:
# Tunjukkan latar belakang. Ini menggunakan sandaran secara lalainya,
# namun anda boleh menambah fail (dinamakan "bg room.png" atau "bg room.jpg")
# ke direktori images untuk menunjukkannya.
scene bg room
# Ini menunjukkan peperi watak. Sandaran digunakan, tetapi anda boleh
# menggantikannya dengan menambah fail bernama "eileen happy.png"
# ke dalam direktori images.
show eileen happy
# Ini memaparkan baris dialog.
e "Anda telah mencipta sebuah permainan Ren'Py baru."
e "Setelah anda menambah cerita, gambar, dan muzik, anda boleh menerbitkannya untuk semua!"
# Ini menamatkan permainan.
return
+2
View File
@@ -0,0 +1,2 @@
translate malay python:
gui.FONT_SCALE = .9
+57 -57
View File
@@ -153,51 +153,51 @@ translate piglatin strings:
old "{#month_short}Dec"
new "{#month_short}Ecday"
# 00action_file.rpy:237
# 00action_file.rpy:240
old "%b %d, %H:%M"
new "%bay %day, %Hay:%May"
# 00action_file.rpy:345
# 00action_file.rpy:353
old "Save slot %s: [text]"
new "Avesay otslay %say: [text]"
# 00action_file.rpy:421
# 00action_file.rpy:434
old "Load slot %s: [text]"
new "Oadlay otslay %say: [text]"
# 00action_file.rpy:466
# 00action_file.rpy:487
old "Delete slot [text]"
new "Eleteday otslay [text]"
# 00action_file.rpy:546
# 00action_file.rpy:569
old "File page auto"
new "Ilefay agepay autoay"
# 00action_file.rpy:548
# 00action_file.rpy:571
old "File page quick"
new "Ilefay agepay uickqay"
# 00action_file.rpy:550
# 00action_file.rpy:573
old "File page [text]"
new "Ilefay agepay [text]"
# 00action_file.rpy:740
# 00action_file.rpy:763
old "Next file page."
new "Extnay ilefay agepay."
# 00action_file.rpy:804
# 00action_file.rpy:827
old "Previous file page."
new "Reviouspay ilefay agepay."
# 00action_file.rpy:865
# 00action_file.rpy:888
old "Quick save complete."
new "Uickqay avesay ompletecay."
# 00action_file.rpy:883
# 00action_file.rpy:906
old "Quick save."
new "Uickqay avesay."
# 00action_file.rpy:902
# 00action_file.rpy:925
old "Quick load."
new "Uickqay oadlay."
@@ -209,91 +209,91 @@ translate piglatin strings:
old "The interactive director is not enabled here."
new "Hetay interactiveay irectorday isay otnay enableday erehay."
# 00director.rpy:1478
# 00director.rpy:1481
old "⬆"
new "⬆"
# 00director.rpy:1484
# 00director.rpy:1487
old "⬇"
new "⬇"
# 00director.rpy:1548
# 00director.rpy:1551
old "Done"
new "Oneday"
# 00director.rpy:1558
# 00director.rpy:1561
old "(statement)"
new "(atementstay)"
# 00director.rpy:1559
# 00director.rpy:1562
old "(tag)"
new "(agtay)"
# 00director.rpy:1560
# 00director.rpy:1563
old "(attributes)"
new "(attributesay)"
# 00director.rpy:1561
# 00director.rpy:1564
old "(transform)"
new "(ansformtray)"
# 00director.rpy:1586
# 00director.rpy:1589
old "(transition)"
new "(ansitiontray)"
# 00director.rpy:1598
# 00director.rpy:1601
old "(channel)"
new "(annelchay)"
# 00director.rpy:1599
# 00director.rpy:1602
old "(filename)"
new "(ilenamefay)"
# 00director.rpy:1628
# 00director.rpy:1631
old "Change"
new "Hangecay"
# 00director.rpy:1630
# 00director.rpy:1633
old "Add"
new "Ddaay"
# 00director.rpy:1633
# 00director.rpy:1636
old "Cancel"
new "Ancelcay"
# 00director.rpy:1636
# 00director.rpy:1639
old "Remove"
new "Emoveray"
# 00director.rpy:1671
# 00director.rpy:1674
old "Statement:"
new "Tatementsay:"
# 00director.rpy:1692
# 00director.rpy:1695
old "Tag:"
new "Agtay:"
# 00director.rpy:1708
# 00director.rpy:1711
old "Attributes:"
new "Ttributesaay:"
# 00director.rpy:1726
# 00director.rpy:1729
old "Transforms:"
new "Ransformstay:"
# 00director.rpy:1745
# 00director.rpy:1748
old "Behind:"
new "Ehindbay:"
# 00director.rpy:1764
# 00director.rpy:1767
old "Transition:"
new "Ransitiontay:"
# 00director.rpy:1782
# 00director.rpy:1785
old "Channel:"
new "Hannelcay:"
# 00director.rpy:1800
# 00director.rpy:1803
old "Audio Filename:"
new "Udioaay Ilenamefay:"
@@ -561,95 +561,95 @@ translate piglatin strings:
old "Contacting App Store\nPlease Wait..."
new "Ontactingcay Ppaay Toresay\nLeasepay Aitway..."
# 00updater.rpy:372
# 00updater.rpy:375
old "The Ren'Py Updater is not supported on mobile devices."
new "Hetay Enray'Ypay Pdateruay isay otnay upportedsay onay obilemay evicesday."
# 00updater.rpy:491
# 00updater.rpy:494
old "An error is being simulated."
new "Naay erroray isay eingbay imulatedsay."
# 00updater.rpy:672
# 00updater.rpy:678
old "Either this project does not support updating, or the update status file was deleted."
new "Ithereay histay rojectpay oesday otnay upportsay updatingay, oray hetay updateay atusstay ilefay asway eletedday."
# 00updater.rpy:686
# 00updater.rpy:692
old "This account does not have permission to perform an update."
new "Histay accountay oesday otnay avehay ermissionpay otay erformpay anay updateay."
# 00updater.rpy:689
# 00updater.rpy:695
old "This account does not have permission to write the update log."
new "Histay accountay oesday otnay avehay ermissionpay otay riteway hetay updateay oglay."
# 00updater.rpy:716
# 00updater.rpy:722
old "Could not verify update signature."
new "Ouldcay otnay erifyvay updateay ignaturesay."
# 00updater.rpy:991
# 00updater.rpy:997
old "The update file was not downloaded."
new "Hetay updateay ilefay asway otnay ownloadedday."
# 00updater.rpy:1009
# 00updater.rpy:1015
old "The update file does not have the correct digest - it may have been corrupted."
new "Hetay updateay ilefay oesday otnay avehay hetay orrectcay igestday - itay aymay avehay eenbay orruptedcay."
# 00updater.rpy:1065
# 00updater.rpy:1071
old "While unpacking {}, unknown type {}."
new "Hileway unpackingay {}, unknownay ypetay {}."
# 00updater.rpy:1412
# 00updater.rpy:1439
old "Updater"
new "Pdateruay"
# 00updater.rpy:1423
# 00updater.rpy:1450
old "This program is up to date."
new "Histay rogrampay isay upay otay ateday."
# 00updater.rpy:1425
# 00updater.rpy:1452
old "[u.version] is available. Do you want to install it?"
new "[u.version] isay availableay. Oday ouyay antway otay installay itay?"
# 00updater.rpy:1427
# 00updater.rpy:1454
old "Preparing to download the updates."
new "Reparingpay otay ownloadday hetay updatesay."
# 00updater.rpy:1429
# 00updater.rpy:1456
old "Downloading the updates."
new "Ownloadingday hetay updatesay."
# 00updater.rpy:1431
# 00updater.rpy:1458
old "Unpacking the updates."
new "Npackinguay hetay updatesay."
# 00updater.rpy:1435
# 00updater.rpy:1462
old "The updates have been installed. The program will restart."
new "Hetay updatesay avehay eenbay installeday. Hetay rogrampay illway estartray."
# 00updater.rpy:1437
# 00updater.rpy:1464
old "The updates have been installed."
new "Hetay updatesay avehay eenbay installeday."
# 00updater.rpy:1439
# 00updater.rpy:1466
old "The updates were cancelled."
new "Hetay updatesay ereway ancelledcay."
# 00gallery.rpy:573
# 00gallery.rpy:585
old "Image [index] of [count] locked."
new "Mageiay [index] ofay [count] ockedlay."
# 00gallery.rpy:593
# 00gallery.rpy:605
old "prev"
new "revpay"
# 00gallery.rpy:594
# 00gallery.rpy:606
old "next"
new "extnay"
# 00gallery.rpy:595
# 00gallery.rpy:607
old "slideshow"
new "ideshowslay"
# 00gallery.rpy:596
# 00gallery.rpy:608
old "return"
new "eturnray"
+25 -13
View File
@@ -37,55 +37,67 @@ translate piglatin strings:
old "Hide Image Load Log (F4)"
new "Idehay Mageiay Oadlay Oglay (4fay)"
# _developer/developer.rpym:95
# _developer/developer.rpym:63
old "Image Attributes"
new "Mageiay Ttributesaay"
# _developer/developer.rpym:90
old "[name] [attributes] (hidden)"
new "[name] [attributes] (iddenhay)"
# _developer/developer.rpym:94
old "[name] [attributes]"
new "[name] [attributes]"
# _developer/developer.rpym:137
old "Nothing to inspect."
new "Othingnay otay inspectay."
# _developer/developer.rpym:223
# _developer/developer.rpym:265
old "Return to the developer menu"
new "Eturnray otay hetay eveloperday enumay"
# _developer/developer.rpym:383
# _developer/developer.rpym:425
old "Rectangle: %r"
new "Ectangleray: %ray"
# _developer/developer.rpym:388
# _developer/developer.rpym:430
old "Mouse position: %r"
new "Ousemay ositionpay: %ray"
# _developer/developer.rpym:393
# _developer/developer.rpym:435
old "Right-click or escape to quit."
new "Ightray-ickclay oray escapeay otay uitqay."
# _developer/developer.rpym:425
# _developer/developer.rpym:467
old "Rectangle copied to clipboard."
new "Ectangleray opiedcay otay ipboardclay."
# _developer/developer.rpym:428
# _developer/developer.rpym:470
old "Position copied to clipboard."
new "Ositionpay opiedcay otay ipboardclay."
# _developer/developer.rpym:447
# _developer/developer.rpym:489
old "Type to filter: "
new "Ypetay otay ilterfay: "
# _developer/developer.rpym:575
# _developer/developer.rpym:617
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Exturestay: [tex_count] ([tex_size_mb:.1f] Bmay)"
# _developer/developer.rpym:579
# _developer/developer.rpym:621
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Mageiay achecay: [cache_pct:.1f]% ([cache_size_mb:.1f] Bmay)"
# _developer/developer.rpym:589
# _developer/developer.rpym:631
old "✔ "
new "✔ "
# _developer/developer.rpym:592
# _developer/developer.rpym:634
old "✘ "
new "✘ "
# _developer/developer.rpym:597
# _developer/developer.rpym:639
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}✔ redictedpay imageay (oodgay){/color}\n{color=#fcc}✘ unpredicteday imageay (adbay){/color}\n{color=#fff}Ragday otay ovemay.{/color}"
+18 -18
View File
@@ -141,75 +141,75 @@ translate piglatin strings:
old "Back (B)"
new "Ackbay (Bay)"
# _errorhandling.rpym:528
# _errorhandling.rpym:529
old "Open"
new "Penoay"
# _errorhandling.rpym:530
# _errorhandling.rpym:531
old "Opens the traceback.txt file in a text editor."
new "Pensoay hetay acebacktray.xttay ilefay inay aay exttay editoray."
# _errorhandling.rpym:532
# _errorhandling.rpym:533
old "Copy"
new "Opycay"
# _errorhandling.rpym:534
# _errorhandling.rpym:535
old "Copies the traceback.txt file to the clipboard."
new "Opiescay hetay acebacktray.xttay ilefay otay hetay ipboardclay."
# _errorhandling.rpym:561
# _errorhandling.rpym:562
old "An exception has occurred."
new "Naay exceptionay ashay occurreday."
# _errorhandling.rpym:581
# _errorhandling.rpym:582
old "Rollback"
new "Ollbackray"
# _errorhandling.rpym:583
# _errorhandling.rpym:584
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Ttemptsaay aay ollray ackbay otay aay riorpay imetay, allowingay ouyay otay avesay oray oosechay aay ifferentday oicechay."
# _errorhandling.rpym:586
# _errorhandling.rpym:587
old "Ignore"
new "Gnoreiay"
# _errorhandling.rpym:590
# _errorhandling.rpym:591
old "Ignores the exception, allowing you to continue."
new "Gnoresiay hetay exceptionay, allowingay ouyay otay ontinuecay."
# _errorhandling.rpym:592
# _errorhandling.rpym:593
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Gnoresiay hetay exceptionay, allowingay ouyay otay ontinuecay. Histay oftenay eadslay otay additionalay errorsay."
# _errorhandling.rpym:596
# _errorhandling.rpym:597
old "Reload"
new "Eloadray"
# _errorhandling.rpym:598
# _errorhandling.rpym:599
old "Reloads the game from disk, saving and restoring game state if possible."
new "Eloadsray hetay amegay omfray iskday, avingsay anday estoringray amegay atestay ifay ossiblepay."
# _errorhandling.rpym:601
# _errorhandling.rpym:602
old "Console"
new "Onsolecay"
# _errorhandling.rpym:603
# _errorhandling.rpym:604
old "Opens a console to allow debugging the problem."
new "Pensoay aay onsolecay otay alloway ebuggingday hetay roblempay."
# _errorhandling.rpym:613
# _errorhandling.rpym:614
old "Quits the game."
new "Uitsqay hetay amegay."
# _errorhandling.rpym:637
# _errorhandling.rpym:638
old "Parsing the script failed."
new "Arsingpay hetay criptsay ailedfay."
# _errorhandling.rpym:663
# _errorhandling.rpym:664
old "Opens the errors.txt file in a text editor."
new "Pensoay hetay errorsay.xttay ilefay inay aay exttay editoray."
# _errorhandling.rpym:667
# _errorhandling.rpym:668
old "Copies the errors.txt file to the clipboard."
new "Opiescay hetay errorsay.xttay ilefay otay hetay ipboardclay."
+1 -1
View File
@@ -138,7 +138,7 @@ translate piglatin strings:
new "## Hetay ordersbay ofay hetay oxbay ontainingcay hetay aracterchay'say amenay, inay eftlay, optay, ightray, ottombay orderay."
# gui.rpy:124
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Fiay Ruetay, hetay ackgroundbay ofay hetay ameboxnay illway ebay iledtay, ifay Alsefay, hetay ackgroundbay ifay hetay ameboxnay illway ebay caledsay."
# gui.rpy:129
+336 -116
View File
@@ -34,8 +34,8 @@ translate piglatin strings:
new "Otay uildbay Ndroidaay ackagespay, easeplay ownloadday Aptray, unzipay itay, anday aceplay itay intoay hetay Enray'Ypay irectoryday. Hentay estartray hetay Enray'Ypay auncherlay."
# android.rpy:31
old "An x86 Java 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."
new "Naay 86xay Avajay Evelopmentday Itkay isay equiredray otay uildbay Ndroidaay ackagespay onay Indowsway. Hetay Dkjay isay ifferentday omfray hetay Rejay, osay itay'say ossiblepay ouyay avehay Avajay ithoutway avinghay hetay Dkjay.\n\nLeasepay {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}ownloadday anday installay hetay Dkjay{/a}, hentay estartray hetay Enray'Ypay auncherlay."
old "A 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."
new "Aay Avajay 8ay Evelopmentday Itkay isay equiredray otay uildbay Ndroidaay ackagespay onay Indowsway. Hetay Dkjay isay ifferentday omfray hetay Rejay, osay itay'say ossiblepay ouyay avehay Avajay ithoutway avinghay hetay Dkjay.\n\nLeasepay {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}ownloadday anday installay hetay Dkjay{/a}, hentay estartray hetay Enray'Ypay auncherlay."
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
@@ -90,113 +90,329 @@ translate piglatin strings:
new "Uildsbay hetay Ndroidaay ackagepay, installsay itay onay anay Ndroidaay eviceday onnectedcay otay ouryay omputercay, hentay auncheslay hetay appay onay ouryay eviceday."
# android.rpy:48
old "Connects to an Android device running ADB in TCP/IP mode."
new "Onnectscay otay anay Ndroidaay eviceday unningray Dbaay inay Cptay/Piay odemay."
# android.rpy:49
old "Disconnects from an Android device running ADB in TCP/IP mode."
new "Isconnectsday omfray anay Ndroidaay eviceday unningray Dbaay inay Cptay/Piay odemay."
# android.rpy:50
old "Retrieves the log from the Android device and writes it to a file."
new "Etrievesray hetay oglay omfray hetay Ndroidaay eviceday anday ritesway itay otay aay ilefay."
# android.rpy:244
# android.rpy:50
old "Selects the Debug build, which can be accessed through Android Studio. Changing between debug and release builds requires an uninstall from your device."
new "Electssay hetay Ebugday uildbay, hichway ancay ebay accesseday hroughtay Ndroidaay Tudiosay. Hangingcay etweenbay ebugday anday eleaseray uildsbay equiresray anay uninstallay omfray ouryay eviceday."
# android.rpy:51
old "Selects the Release build, which can be uploaded to stores. Changing between debug and release builds requires an uninstall from your device."
new "Electssay hetay Eleaseray uildbay, hichway ancay ebay uploadeday otay oresstay. Hangingcay etweenbay ebugday anday eleaseray uildsbay equiresray anay uninstallay omfray ouryay eviceday."
# android.rpy:243
old "Copying Android files to distributions directory."
new "Opyingcay Ndroidaay ilesfay otay istributionsday irectoryday."
# android.rpy:308
# android.rpy:311
old "Android: [project.current.display_name!q]"
new "Ndroidaay: [project.current.display_name!q]"
# android.rpy:328
# android.rpy:331
old "Emulation:"
new "Mulationeay:"
# android.rpy:337
# android.rpy:340
old "Phone"
new "Honepay"
# android.rpy:341
# android.rpy:344
old "Tablet"
new "Ablettay"
# android.rpy:345
# android.rpy:348
old "Television"
new "Elevisiontay"
# android.rpy:357
# android.rpy:360
old "Build:"
new "Uildbay:"
# android.rpy:365
# android.rpy:371
old "Debug"
new "Ebugday"
# android.rpy:375
old "Release"
new "Eleaseray"
# android.rpy:382
old "Install SDK & Create Keys"
new "Nstalliay Dksay & Reatecay Eyskay"
# android.rpy:369
# android.rpy:386
old "Configure"
new "Onfigurecay"
# android.rpy:373
# android.rpy:390
old "Build Package"
new "Uildbay Ackagepay"
# android.rpy:377
# android.rpy:394
old "Build & Install"
new "Uildbay & Nstalliay"
# android.rpy:381
# android.rpy:398
old "Build, Install & Launch"
new "Uildbay, Nstalliay & Aunchlay"
# android.rpy:392
# android.rpy:409
old "Other:"
new "Theroay:"
# android.rpy:400
old "Remote ADB Connect"
new "Emoteray Dbaay Onnectcay"
# android.rpy:404
old "Remote ADB Disconnect"
new "Emoteray Dbaay Isconnectday"
# android.rpy:408
# android.rpy:417
old "Logcat"
new "Ogcatlay"
# android.rpy:441
# android.rpy:450
old "Before packaging Android apps, you'll need to download RAPT, the Ren'Py Android Packaging Tool. Would you like to download RAPT now?"
new "Eforebay ackagingpay Ndroidaay appsay, ouyay'llay eednay otay ownloadday Aptray, hetay Enray'Ypay Ndroidaay Ackagingpay Ooltay. Ouldway ouyay ikelay otay ownloadday Aptray ownay?"
# android.rpy:500
old "Remote ADB Address"
new "Emoteray Dbaay Ddressaay"
# android.rpy:500
old "Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."
new "Leasepay enteray hetay Piay addressay anday ortpay umbernay otay onnectcay otay, inay hetay ormfay \"921ay.681ay.1ay.431ay:5555ay\". Onsultcay ouryay eviceday'say ocumentationday otay etermineday ifay itay upportssay emoteray Dbaay, anday ifay osay, hetay addressay anday ortpay otay useay."
# android.rpy:512
old "Invalid remote ADB address"
new "Nvalidiay emoteray Dbaay addressay"
# android.rpy:512
old "The address must contain one exactly one ':'."
new "Hetay addressay ustmay ontaincay oneay exactlyay oneay ':'."
# android.rpy:516
old "The host may not contain whitespace."
new "Hetay osthay aymay otnay ontaincay hitespaceway."
# android.rpy:522
old "The port must be a number."
new "Hetay ortpay ustmay ebay aay umbernay."
# android.rpy:548
# android.rpy:503
old "Retrieving logcat information from device."
new "Etrievingray ogcatlay informationay omfray eviceday."
# androidstrings.rpy:7
old "{} is not a directory."
new "{} isay otnay aay irectoryday."
# androidstrings.rpy:8
old "{} does not contain a Ren'Py game."
new "{} oesday otnay ontaincay aay Enray'Ypay amegay."
# androidstrings.rpy:9
old "Run configure before attempting to build the app."
new "Unray onfigurecay eforebay attemptingay otay uildbay hetay appay."
# androidstrings.rpy:10
old "Google Play support is enabled, but build.google_play_key is not defined."
new "Ooglegay Laypay upportsay isay enableday, utbay uildbay.oogle_play_keygay isay otnay efinedday."
# androidstrings.rpy:11
old "Creating assets directory."
new "Reatingcay assetsay irectoryday."
# androidstrings.rpy:12
old "Creating expansion file."
new "Reatingcay expansionay ilefay."
# androidstrings.rpy:13
old "Packaging internal data."
new "Ackagingpay internalay ataday."
# androidstrings.rpy:14
old "I'm using Gradle to build the package."
new "Iay'may usingay Radlegay otay uildbay hetay ackagepay."
# androidstrings.rpy:15
old "Uploading expansion file."
new "Ploadinguay expansionay ilefay."
# androidstrings.rpy:16
old "The build seems to have failed."
new "Hetay uildbay eemssay otay avehay ailedfay."
# androidstrings.rpy:17
old "Launching app."
new "Aunchinglay appay."
# androidstrings.rpy:18
old "The build seems to have succeeded."
new "Hetay uildbay eemssay otay avehay ucceededsay."
# androidstrings.rpy:19
old "What is the full name of your application? This name will appear in the list of installed applications."
new "Hatway isay hetay ullfay amenay ofay ouryay applicationay? Histay amenay illway appearay inay hetay istlay ofay installeday applicationsay."
# androidstrings.rpy:20
old "What is the short name of your application? This name will be used in the launcher, and for application shortcuts."
new "Hatway isay hetay ortshay amenay ofay ouryay applicationay? Histay amenay illway ebay useday inay hetay auncherlay, anday orfay applicationay ortcutsshay."
# androidstrings.rpy:21
old "What is the name of the package?\n\nThis is usually of the form com.domain.program or com.domain.email.program. It may only contain ASCII letters and dots. It must contain at least one dot."
new "Hatway isay hetay amenay ofay hetay ackagepay?\n\nHistay isay usuallyay ofay hetay ormfay omcay.omainday.rogrampay oray omcay.omainday.emailay.rogrampay. Tiay aymay onlyay ontaincay Sciiaay etterslay anday otsday. Tiay ustmay ontaincay atay eastlay oneay otday."
# androidstrings.rpy:22
old "The package name may not be empty."
new "Hetay ackagepay amenay aymay otnay ebay emptyay."
# androidstrings.rpy:23
old "The package name may not contain spaces."
new "Hetay ackagepay amenay aymay otnay ontaincay pacessay."
# androidstrings.rpy:24
old "The package name must contain at least one dot."
new "Hetay ackagepay amenay ustmay ontaincay atay eastlay oneay otday."
# androidstrings.rpy:25
old "The package name may not contain two dots in a row, or begin or end with a dot."
new "Hetay ackagepay amenay aymay otnay ontaincay wotay otsday inay aay owray, oray eginbay oray enday ithway aay otday."
# androidstrings.rpy:26
old "Each part of the package name must start with a letter, and contain only letters, numbers, and underscores."
new "Acheay artpay ofay hetay ackagepay amenay ustmay artstay ithway aay etterlay, anday ontaincay onlyay etterslay, umbersnay, anday underscoresay."
# androidstrings.rpy:27
old "{} is a Java keyword, and can't be used as part of a package name."
new "{} isay aay Avajay eywordkay, anday ancay'tay ebay useday asay artpay ofay aay ackagepay amenay."
# androidstrings.rpy:28
old "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."
new "Hatway isay hetay applicationay'say ersionvay?\n\nHistay ouldshay ebay hetay umanhay-eadableray ersionvay hattay ouyay ouldway resentpay otay aay ersonpay. Tiay ustmay ontaincay onlyay umbersnay anday otsday."
# androidstrings.rpy:29
old "The version number must contain only numbers and dots."
new "Hetay ersionvay umbernay ustmay ontaincay onlyay umbersnay anday otsday."
# androidstrings.rpy:30
old "What is the version code?\n\nThis must be a positive integer number, and the value should increase between versions."
new "Hatway isay hetay ersionvay odecay?\n\nHistay ustmay ebay aay ositivepay integeray umbernay, anday hetay aluevay ouldshay increaseay etweenbay ersionsvay."
# androidstrings.rpy:31
old "The numeric version must contain only numbers."
new "Hetay umericnay ersionvay ustmay ontaincay onlyay umbersnay."
# androidstrings.rpy:32
old "How would you like your application to be displayed?"
new "Owhay ouldway ouyay ikelay ouryay applicationay otay ebay isplayedday?"
# androidstrings.rpy:33
old "In landscape orientation."
new "Niay andscapelay orientationay."
# androidstrings.rpy:34
old "In portrait orientation."
new "Niay ortraitpay orientationay."
# androidstrings.rpy:35
old "In the user's preferred orientation."
new "Niay hetay useray'say referredpay orientationay."
# androidstrings.rpy:36
old "Which app store would you like to support in-app purchasing through?"
new "Hichway appay orestay ouldway ouyay ikelay otay upportsay inay-appay urchasingpay hroughtay?"
# androidstrings.rpy:37
old "Google Play."
new "Ooglegay Laypay."
# androidstrings.rpy:38
old "Amazon App Store."
new "Mazonaay Ppaay Toresay."
# androidstrings.rpy:39
old "Both, in one app."
new "Othbay, inay oneay appay."
# androidstrings.rpy:40
old "Neither."
new "Eithernay."
# androidstrings.rpy:41
old "Would you like to create an expansion APK?"
new "Ouldway ouyay ikelay otay reatecay anay expansionay Pkaay?"
# androidstrings.rpy:42
old "No. Size limit of 100 MB on Google Play, but can be distributed through other stores and sideloaded."
new "Onay. Izesay imitlay ofay 001ay Bmay onay Ooglegay Laypay, utbay ancay ebay istributedday hroughtay otheray oresstay anday ideloadedsay."
# androidstrings.rpy:43
old "Yes. 2 GB size limit, but won't work outside of Google Play. (Read the documentation to get this to work.)"
new "Esyay. 2ay Bgay izesay imitlay, utbay onway'tay orkway outsideay ofay Ooglegay Laypay. (Eadray hetay ocumentationday otay etgay histay otay orkway.)"
# androidstrings.rpy:44
old "Do you want to allow the app to access the Internet?"
new "Oday ouyay antway otay alloway hetay appay otay accessay hetay Nternetiay?"
# androidstrings.rpy:45
old "Unknown configuration variable: {}"
new "Nknownuay onfigurationcay ariablevay: {}"
# androidstrings.rpy:46
old "I'm compiling a short test program, to see if you have a working JDK on your system."
new "Iay'may ompilingcay aay ortshay esttay rogrampay, otay eesay ifay ouyay avehay aay orkingway Dkjay onay ouryay ystemsay."
# androidstrings.rpy:47
old "I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\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."
new "Iay asway unableay otay useay avacjay otay ompilecay aay esttay ilefay. Fiay ouyay avenhay'tay installeday hetay Avajay Evelopmentday Itkay etyay, easeplay ownloadday itay omfray:\n\nttphay://wwway.oracleay.omcay/echnetworktay/avajay/avasejay/ownloadsday/dk8jay-ownloadsday-1331512ay.tmlhay\n\nHetay Dkjay isay ifferentday omfray hetay Rejay, osay itay'say ossiblepay ouyay avehay Avajay ithoutway avinghay hetay Dkjay. Ithoutway aay orkingway Dkjay, Iay ancay'tay ontinuecay."
# androidstrings.rpy:48
old "The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\n\nYou can also set the JAVA_HOME environment variabe to use a different version of Java."
new "Hetay ersionvay ofay Avajay onay ouryay omputercay oesday otnay appearay otay ebay Dkjay 8ay, hichway isay hetay onlyay ersionvay upportedsay ybay hetay Ndroidaay Dksay. Fiay ouyay eednay otay installay Dkjay 8ay, ouyay ancay ownloadday itay omfray:\n\nttphay://wwway.oracleay.omcay/echnetworktay/avajay/avasejay/ownloadsday/dk8jay-ownloadsday-1331512ay.tmlhay\n\nOuyay ancay alsoay etsay hetay Ava_homejay environmentay ariabevay otay useay aay ifferentday ersionvay ofay Avajay."
# androidstrings.rpy:49
old "The JDK is present and working. Good!"
new "Hetay Dkjay isay resentpay anday orkingway. Oodgay!"
# androidstrings.rpy:50
old "The Android SDK has already been unpacked."
new "Hetay Ndroidaay Dksay ashay alreadyay eenbay unpackeday."
# androidstrings.rpy:51
old "Do you accept the Android SDK Terms and Conditions?"
new "Oday ouyay acceptay hetay Ndroidaay Dksay Ermstay anday Onditionscay?"
# androidstrings.rpy:52
old "I'm downloading the Android SDK. This might take a while."
new "Iay'may ownloadingday hetay Ndroidaay Dksay. Histay ightmay aketay aay hileway."
# androidstrings.rpy:53
old "I'm extracting the Android SDK."
new "Iay'may extractingay hetay Ndroidaay Dksay."
# androidstrings.rpy:54
old "I've finished unpacking the Android SDK."
new "Iay'evay inishedfay unpackingay hetay Ndroidaay Dksay."
# androidstrings.rpy:55
old "I'm about to download and install the required Android packages. This might take a while."
new "Iay'may aboutay otay ownloadday anday installay hetay equiredray Ndroidaay ackagespay. Histay ightmay aketay aay hileway."
# androidstrings.rpy:56
old "I was unable to accept the Android licenses."
new "Iay asway unableay otay acceptay hetay Ndroidaay icenseslay."
# androidstrings.rpy:57
old "I was unable to install the required Android packages."
new "Iay asway unableay otay installay hetay equiredray Ndroidaay ackagespay."
# androidstrings.rpy:58
old "I've finished installing the required Android packages."
new "Iay'evay inishedfay installingay hetay equiredray Ndroidaay ackagespay."
# androidstrings.rpy:59
old "You set the keystore yourself, so I'll assume it's how you want it."
new "Ouyay etsay hetay eystorekay ourselfyay, osay Iay'llay assumeay itay'say owhay ouyay antway itay."
# androidstrings.rpy:60
old "You've already created an Android keystore, so I won't create a new one for you."
new "Ouyay'evay alreadyay reatedcay anay Ndroidaay eystorekay, osay Iay onway'tay reatecay aay ewnay oneay orfay ouyay."
# androidstrings.rpy:61
old "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?"
new "Iay ancay reatecay anay applicationay igningsay eykay orfay ouyay. Igningsay anay applicationay ithway histay eykay allowsay itay otay ebay acedplay inay hetay Ndroidaay Arketmay anday otheray appay oresstay.\n\nOday ouyay antway otay reatecay aay eykay?"
# androidstrings.rpy:62
old "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?"
new "Iay illway reatecay hetay eykay inay hetay androiday.eystorekay ilefay.\n\nOuyay eednay otay ackbay histay ilefay upay. Fiay ouyay oselay itay, ouyay illway otnay ebay ableay otay upgradeay ouryay applicationay.\n\n\\Ouyay alsoay eednay otay eepkay hetay eykay afesay. Fiay evilay eoplepay etgay histay ilefay, heytay ouldcay akemay akefay ersionsvay ofay ouryay applicationay, anday otentiallypay ealstay ouryay usersay' ataday.\n\nIllway ouyay akemay aay ackupbay ofay androiday.eystorekay, anday eepkay itay inay aay afesay aceplay?"
# androidstrings.rpy:63
old "Please enter your name or the name of your organization."
new "Leasepay enteray ouryay amenay oray hetay amenay ofay ouryay organizationay."
# androidstrings.rpy:64
old "Could not create android.keystore. Is keytool in your path?"
new "Ouldcay otnay reatecay androiday.eystorekay. Siay eytoolkay inay ouryay athpay?"
# androidstrings.rpy:65
old "I've finished creating android.keystore. Please back it up, and keep it in a safe place."
new "Iay'evay inishedfay reatingcay androiday.eystorekay. Leasepay ackbay itay upay, anday eepkay itay inay aay afesay aceplay."
# androidstrings.rpy:66
old "It looks like you're ready to start packaging games."
new "Tiay ookslay ikelay ouyay'eray eadyray otay artstay ackagingpay amesgay."
# choose_directory.rpy:87
old "Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."
new "Enray'Ypay asway unableay otay unray ythonpay ithway kintertay otay oosechay hetay irectoryday. Leasepay installay hetay ythonpay-ktay oray kintertay ackagepay."
@@ -961,63 +1177,59 @@ translate piglatin strings:
old "Text editor: [text]"
new "Exttay editoray: [text]"
# preferences.rpy:142
old "Update Channel:"
new "Pdateuay Hannelcay:"
# preferences.rpy:162
# preferences.rpy:145
old "Navigation Options:"
new "Avigationnay Ptionsoay:"
# preferences.rpy:166
# preferences.rpy:149
old "Include private names"
new "Ncludeiay rivatepay amesnay"
# preferences.rpy:167
# preferences.rpy:150
old "Include library names"
new "Ncludeiay ibrarylay amesnay"
# preferences.rpy:177
# preferences.rpy:160
old "Launcher Options:"
new "Auncherlay Ptionsoay:"
# preferences.rpy:181
# preferences.rpy:164
old "Hardware rendering"
new "Ardwarehay enderingray"
# preferences.rpy:182
# preferences.rpy:165
old "Show edit file section"
new "Howsay editay ilefay ectionsay"
# preferences.rpy:183
# preferences.rpy:166
old "Large fonts"
new "Argelay ontsfay"
# preferences.rpy:186
# preferences.rpy:169
old "Console output"
new "Onsolecay outputay"
# preferences.rpy:190
# preferences.rpy:173
old "Force new tutorial"
new "Orcefay ewnay utorialtay"
# preferences.rpy:194
# preferences.rpy:177
old "Legacy options"
new "Egacylay optionsay"
# preferences.rpy:197
# preferences.rpy:180
old "Show templates"
new "Howsay emplatestay"
# preferences.rpy:199
# preferences.rpy:182
old "Sponsor message"
new "Ponsorsay essagemay"
# preferences.rpy:219
# preferences.rpy:202
old "Open launcher project"
new "Penoay auncherlay rojectpay"
# preferences.rpy:233
# preferences.rpy:216
old "Language:"
new "Anguagelay:"
@@ -1037,35 +1249,35 @@ translate piglatin strings:
old "Have you backed up your projects recently?"
new "Avehay ouyay ackedbay upay ouryay rojectspay ecentlyray?"
# project.rpy:280
# project.rpy:281
old "Launching the project failed."
new "Aunchinglay hetay rojectpay ailedfay."
# project.rpy:280
# project.rpy:281
old "Please ensure that your project launches normally before running this command."
new "Leasepay ensureay hattay ouryay rojectpay auncheslay ormallynay eforebay unningray histay ommandcay."
# project.rpy:296
# project.rpy:297
old "Ren'Py is scanning the project..."
new "Enray'Ypay isay canningsay hetay rojectpay..."
# project.rpy:728
# project.rpy:729
old "Launching"
new "Aunchinglay"
# project.rpy:762
# project.rpy:763
old "PROJECTS DIRECTORY"
new "Rojectspay Irectoryday"
# project.rpy:762
# project.rpy:763
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "Leasepay oosechay hetay rojectspay irectoryday usingay hetay irectoryday ooserchay.\n{b}Hetay irectoryday ooserchay aymay avehay openeday ehindbay histay indowway.{/b}"
# project.rpy:762
# project.rpy:763
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "Histay auncherlay illway cansay orfay rojectspay inay histay irectoryday, illway reatecay ewnay rojectspay inay histay irectoryday, anday illway aceplay uiltbay rojectspay intoay histay irectoryday."
# project.rpy:767
# project.rpy:768
old "Ren'Py has set the projects directory to:"
new "Enray'Ypay ashay etsay hetay rojectspay irectoryday otay:"
@@ -1173,95 +1385,103 @@ translate piglatin strings:
old "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[persistent.dialogue_format] in the base directory."
new "Enray'Ypay ashay inishedfay extractingay ialogueday. Hetay extracteday ialogueday ancay ebay oundfay inay ialogueday.[persistent.dialogue_format] inay hetay asebay irectoryday."
# updater.rpy:75
old "Select Update Channel"
new "Electsay Pdateuay Hannelcay"
# updater.rpy:86
old "The update channel controls the version of Ren'Py the updater will download. Please select an update channel:"
new "Hetay updateay annelchay ontrolscay hetay ersionvay ofay Enray'Ypay hetay updateray illway ownloadday. Leasepay electsay anay updateay annelchay:"
# updater.rpy:91
old "Release"
new "Eleaseray"
# updater.rpy:97
# updater.rpy:63
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
new "{b}Ecommendedray.{/b} Hetay ersionvay ofay Enray'Ypay hattay ouldshay ebay useday inay allay ewlynay-eleasedray amesgay."
# updater.rpy:102
# updater.rpy:65
old "Prerelease"
new "Rereleasepay"
# updater.rpy:108
# updater.rpy:66
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
new "Aay reviewpay ofay hetay extnay ersionvay ofay Enray'Ypay hattay ancay ebay useday orfay estingtay anday akingtay advantageay ofay ewnay eaturesfay, utbay otnay orfay inalfay eleasesray ofay amesgay."
# updater.rpy:114
# updater.rpy:68
old "Experimental"
new "Xperimentaleay"
# updater.rpy:120
# updater.rpy:69
old "Experimental versions of Ren'Py. You shouldn't select this channel unless asked by a Ren'Py developer."
new "Xperimentaleay ersionsvay ofay Enray'Ypay. Ouyay ouldnshay'tay electsay histay annelchay unlessay askeday ybay aay Enray'Ypay eveloperday."
# updater.rpy:126
# updater.rpy:71
old "Nightly"
new "Ightlynay"
# updater.rpy:132
# updater.rpy:72
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Hetay eedingblay edgeay ofay Enray'Ypay evelopmentday. Histay aymay avehay hetay atestlay eaturesfay, oray ightmay otnay unray atay allay."
# updater.rpy:152
# updater.rpy:90
old "Select Update Channel"
new "Electsay Pdateuay Hannelcay"
# updater.rpy:101
old "The update channel controls the version of Ren'Py the updater will download."
new "Hetay updateay annelchay ontrolscay hetay ersionvay ofay Enray'Ypay hetay updateray illway ownloadday."
# updater.rpy:110
old "• This version is installed and up-to-date."
new "• Histay ersionvay isay installeday anday upay-otay-ateday."
# updater.rpy:118
old "%B %d, %Y"
new "%Bay %day, %Yay"
# updater.rpy:140
old "An error has occured:"
new "Naay erroray ashay occureday:"
# updater.rpy:154
# updater.rpy:142
old "Checking for updates."
new "Heckingcay orfay updatesay."
# updater.rpy:156
# updater.rpy:144
old "Ren'Py is up to date."
new "Enray'Ypay isay upay otay ateday."
# updater.rpy:158
# updater.rpy:146
old "[u.version] is now available. Do you want to install it?"
new "[u.version] isay ownay availableay. Oday ouyay antway otay installay itay?"
# updater.rpy:160
# updater.rpy:148
old "Preparing to download the update."
new "Reparingpay otay ownloadday hetay updateay."
# updater.rpy:162
# updater.rpy:150
old "Downloading the update."
new "Ownloadingday hetay updateay."
# updater.rpy:164
# updater.rpy:152
old "Unpacking the update."
new "Npackinguay hetay updateay."
# updater.rpy:166
# updater.rpy:154
old "Finishing up."
new "Inishingfay upay."
# updater.rpy:168
# updater.rpy:156
old "The update has been installed. Ren'Py will restart."
new "Hetay updateay ashay eenbay installeday. Enray'Ypay illway estartray."
# updater.rpy:170
# updater.rpy:158
old "The update has been installed."
new "Hetay updateay ashay eenbay installeday."
# updater.rpy:172
# updater.rpy:160
old "The update was cancelled."
new "Hetay updateay asway ancelledcay."
# updater.rpy:189
# updater.rpy:177
old "Ren'Py Update"
new "Enray'Ypay Pdateuay"
# updater.rpy:195
# updater.rpy:183
old "Proceed"
new "Roceedpay"
# updater.rpy:188
old "Fetching the list of update channels"
new "Etchingfay hetay istlay ofay updateay annelschay"
+243 -75
View File
@@ -153,179 +153,187 @@ translate russian strings:
old "{#month_short}Dec"
new "{#month_short}Дек"
# 00action_file.rpy:237
# 00action_file.rpy:240
old "%b %d, %H:%M"
new "%d %b, %H:%M"
# 00action_file.rpy:344
# 00action_file.rpy:353
old "Save slot %s: [text]"
new "Слот сохранения %s: [text]"
# 00action_file.rpy:417
# 00action_file.rpy:434
old "Load slot %s: [text]"
new "Слот загрузки %s: [text]"
# 00action_file.rpy:459
# 00action_file.rpy:487
old "Delete slot [text]"
new "Удалить слот [text]"
# 00action_file.rpy:539
# 00action_file.rpy:569
old "File page auto"
new "Автосохранения"
# 00action_file.rpy:541
# 00action_file.rpy:571
old "File page quick"
new "Быстрые сохранения"
# 00action_file.rpy:543
# 00action_file.rpy:573
old "File page [text]"
new "Страница сохранений [text]"
# 00action_file.rpy:733
# 00action_file.rpy:763
old "Next file page."
new "Следующая страница сохранений"
# 00action_file.rpy:797
# 00action_file.rpy:827
old "Previous file page."
new "Предыдущая страница сохранений"
# 00action_file.rpy:858
# 00action_file.rpy:888
old "Quick save complete."
new "Быстрое сохранение завершено."
# 00action_file.rpy:876
# 00action_file.rpy:906
old "Quick save."
new "Быстрое сохранение"
# 00action_file.rpy:895
# 00action_file.rpy:925
old "Quick load."
new "Быстрая загрузка"
# 00action_other.rpy:344
# 00action_other.rpy:355
old "Language [text]"
new "Язык [text]"
# 00director.rpy:703
# 00director.rpy:708
old "The interactive director is not enabled here."
new "Интерактивный директор недоступен."
# 00director.rpy:1490
# 00director.rpy:1481
old "⬆"
new "⬆"
# 00director.rpy:1487
old "⬇"
new "⬇"
# 00director.rpy:1551
old "Done"
new "Принять"
# 00director.rpy:1498
# 00director.rpy:1561
old "(statement)"
new "(функция)"
# 00director.rpy:1499
# 00director.rpy:1562
old "(tag)"
new "(тег)"
# 00director.rpy:1500
# 00director.rpy:1563
old "(attributes)"
new "(аттрибут)"
# 00director.rpy:1501
# 00director.rpy:1564
old "(transform)"
new "(трансформация)"
# 00director.rpy:1526
# 00director.rpy:1589
old "(transition)"
new "(переход)"
# 00director.rpy:1538
# 00director.rpy:1601
old "(channel)"
new "(канал)"
# 00director.rpy:1539
# 00director.rpy:1602
old "(filename)"
new "(имя файла)"
# 00director.rpy:1564
# 00director.rpy:1631
old "Change"
new "Изменить"
# 00director.rpy:1566
# 00director.rpy:1633
old "Add"
new "Добавить"
# 00director.rpy:1569
# 00director.rpy:1636
old "Cancel"
new "Отмена"
# 00director.rpy:1572
# 00director.rpy:1639
old "Remove"
new "Убрать"
# 00director.rpy:1605
# 00director.rpy:1674
old "Statement:"
new "Функции:"
# 00director.rpy:1626
# 00director.rpy:1695
old "Tag:"
new "Теги:"
# 00director.rpy:1642
# 00director.rpy:1711
old "Attributes:"
new "Аттрибут:"
# 00director.rpy:1660
# 00director.rpy:1729
old "Transforms:"
new "Трансформации:"
# 00director.rpy:1679
# 00director.rpy:1748
old "Behind:"
new "Позади:"
# 00director.rpy:1698
# 00director.rpy:1767
old "Transition:"
new "Переходы:"
# 00director.rpy:1716
# 00director.rpy:1785
old "Channel:"
new "Каналы:"
# 00director.rpy:1734
# 00director.rpy:1803
old "Audio Filename:"
new "Имя файла:"
# 00gui.rpy:368
# 00gui.rpy:370
old "Are you sure?"
new "Вы уверены?"
# 00gui.rpy:369
# 00gui.rpy:371
old "Are you sure you want to delete this save?"
new "Вы уверены, что хотите удалить это сохранение?"
# 00gui.rpy:370
# 00gui.rpy:372
old "Are you sure you want to overwrite your save?"
new "Вы уверены, что хотите перезаписать ваше сохранение?"
# 00gui.rpy:371
# 00gui.rpy:373
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Загрузка игры приведёт к потере несохранённого прогресса.\nВы уверены, что хотите это сделать?"
# 00gui.rpy:372
# 00gui.rpy:374
old "Are you sure you want to quit?"
new "Вы уверены, что хотите выйти?"
# 00gui.rpy:373
# 00gui.rpy:375
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Вы уверены, что хотите вернуться в главное меню?\nЭто приведёт к потере несохранённого прогресса."
# 00gui.rpy:374
# 00gui.rpy:376
old "Are you sure you want to end the replay?"
new "Вы уверены, что хотите завершить повтор?"
# 00gui.rpy:375
# 00gui.rpy:377
old "Are you sure you want to begin skipping?"
new "Вы уверены, что хотите начать пропуск?"
# 00gui.rpy:376
# 00gui.rpy:378
old "Are you sure you want to skip to the next choice?"
new "Вы точно хотите пропустить всё до следующего выбора?"
# 00gui.rpy:377
# 00gui.rpy:379
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Вы уверены, что хотите пропустить непрочитанные диалоги до следующего выбора?"
@@ -379,11 +387,11 @@ translate russian strings:
# 00library.rpy:157
old "increase"
new "больше" ### но полоса прокрутки тоже здесь!
new "больше"
# 00library.rpy:158
old "decrease"
new "меньше" ###
new "меньше"
# 00library.rpy:193
old "Skip Mode"
@@ -431,7 +439,7 @@ translate russian strings:
# 00preferences.rpy:266
old "skip unseen [text]"
new "пропускать весь [text]" ###
new "пропускать весь [text]"
# 00preferences.rpy:271
old "skip unseen text"
@@ -455,11 +463,11 @@ translate russian strings:
# 00preferences.rpy:300
old "auto-forward"
new "авточтение" ###
new "авточтение"
# 00preferences.rpy:307
old "Auto forward"
new "Авточтение" ###
new "Авточтение"
# 00preferences.rpy:310
old "auto-forward after click"
@@ -537,111 +545,271 @@ translate russian strings:
old "mute all"
new "режим без звука"
# 00preferences.rpy:498
# 00preferences.rpy:500
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Озвучка буфера обмена включена. Нажмите 'shift+C', чтобы отключить её."
# 00preferences.rpy:500
# 00preferences.rpy:502
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Синтезатор речи должен сказать \"[renpy.display.tts.last]\". Нажмите 'alt+shift+V', чтобы отключить его."
# 00preferences.rpy:502
# 00preferences.rpy:504
old "Self-voicing enabled. Press 'v' to disable."
new "Синтезатор речи включён. Нажмите 'v', чтобы отключить его."
# _compat\gamemenu.rpym:198
old "Empty Slot."
new "Пустой слот"
# _compat\gamemenu.rpym:355
old "Previous"
new "Назад"
# _compat\gamemenu.rpym:362
old "Next"
new "Далее"
# _compat\preferences.rpym:428
old "Joystick Mapping"
new "Раскладка джойстика"
# _developer\developer.rpym:38
old "Developer Menu"
new "Меню разработчика"
# _developer\developer.rpym:43
old "Interactive Director (D)"
new "Интерактивный Директор (D)"
# _developer\developer.rpym:45
old "Reload Game (Shift+R)"
new "Перезагрузить игру (Shift+R)"
# _developer\developer.rpym:47
old "Console (Shift+O)"
new "Консоль (Shift+O)"
# _developer\developer.rpym:49
old "Variable Viewer"
new "Просмотр переменных"
# _developer\developer.rpym:51
old "Image Location Picker"
new "Инструмент позиционирования на изображениях"
# _developer\developer.rpym:53
old "Filename List"
new "Список файлов"
# _developer\developer.rpym:57
old "Show Image Load Log (F4)"
new "Показать лог загрузки изображений (F4)"
# _developer\developer.rpym:60
old "Hide Image Load Log (F4)"
new "Скрыть лог загрузки изображений (F4)"
# _developer\developer.rpym:63
old "Image Attributes"
new "Аттрибуты изображения"
# _developer\developer.rpym:90
old "[name] [attributes] (hidden)"
new "[name] [attributes] (hidden)"
# _developer\developer.rpym:94
old "[name] [attributes]"
new "[name] [attributes]"
# _developer\developer.rpym:137
old "Nothing to inspect."
new "Переменные не заданы."
# _developer\developer.rpym:265
old "Return to the developer menu"
new "Вернуться в меню разработчика"
# _developer\developer.rpym:425
old "Rectangle: %r"
new "Прямоугольник: %r"
# _developer\developer.rpym:430
old "Mouse position: %r"
new "Позиция мыши: %r"
# _developer\developer.rpym:435
old "Right-click or escape to quit."
new "Нажмите правую кнопку мыши или ESC чтобы выйти."
# _developer\developer.rpym:467
old "Rectangle copied to clipboard."
new "Координаты прямоугольника скопированы в буфер обмена."
# _developer\developer.rpym:470
old "Position copied to clipboard."
new "Координаты позиции скопированы в буфер обмена."
# _developer\developer.rpym:489
old "Type to filter: "
new "Текущий фильтр: "
# _developer\developer.rpym:617
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Текстур: [tex_count] ([tex_size_mb:.1f] МБ)"
# _developer\developer.rpym:621
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Кеш изображений: [cache_pct:.1f]% ([cache_size_mb:.1f] МБ)"
# _developer\developer.rpym:631
old "✔ "
new "✔ "
# _developer\developer.rpym:634
old "✘ "
new "✘ "
# _developer\developer.rpym:639
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}✔ предсказанное изображение (хорошо){/color}\n{color=#fcc}✘ внезапное изображение (плохо){/color}\n{color=#fff}Нажмите, чтобы передвинуть.{/color}"
# _developer\inspector.rpym:38
old "Displayable Inspector"
new "Диспетчер объектов"
# _developer\inspector.rpym:61
old "Size"
new "Разрешение"
# _developer\inspector.rpym:65
old "Style"
new "Стиль"
# _developer\inspector.rpym:71
old "Location"
new "Местоположение"
# _developer\inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "Инспектирую стили [displayable_name!q]"
# _developer\inspector.rpym:139
old "displayable:"
new "объект:"
# _developer\inspector.rpym:145
old " (no properties affect the displayable)"
new " (на объект не влияют никакие параметры)"
# _developer\inspector.rpym:147
old " (default properties omitted)"
new " (настройки по умолчанию опущены)"
# _developer\inspector.rpym:185
old "<repr() failed>"
new "<repr() провален>"
# _layout\classic_load_save.rpym:170
old "a"
new "а"
# _layout\classic_load_save.rpym:179
old "q"
new "б"
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Связываюсь с App Store\nПожалуйста, ждите..."
# 00updater.rpy:372
# 00updater.rpy:375
old "The Ren'Py Updater is not supported on mobile devices."
new "Ren'Py Updater не поддерживается на мобильных устройствах."
# 00updater.rpy:491
# 00updater.rpy:494
old "An error is being simulated."
new "Симулируется ошибка."
# 00updater.rpy:672
# 00updater.rpy:678
old "Either this project does not support updating, or the update status file was deleted."
new "Или этот проект не поддерживает обновление, или файл статуса обновления был удалён."
# 00updater.rpy:686
# 00updater.rpy:692
old "This account does not have permission to perform an update."
new "У этого аккаунта нет прав проводить обновление."
# 00updater.rpy:689
# 00updater.rpy:695
old "This account does not have permission to write the update log."
new "У этого аккаунта нет прав писать лог обновления."
# 00updater.rpy:716
# 00updater.rpy:722
old "Could not verify update signature."
new "Не могу верифицировать подпись обновления."
# 00updater.rpy:991
# 00updater.rpy:997
old "The update file was not downloaded."
new "Файл обновления не был загружен."
# 00updater.rpy:1009
# 00updater.rpy:1015
old "The update file does not have the correct digest - it may have been corrupted."
new "Файл обновления не содержит корректного дайджеста — он может быть повреждён."
# 00updater.rpy:1065
# 00updater.rpy:1071
old "While unpacking {}, unknown type {}."
new "При распаковке {} обнаружен неизвестный тип {}."
# 00updater.rpy:1412
# 00updater.rpy:1439
old "Updater"
new "Обновление"
# 00updater.rpy:1423
# 00updater.rpy:1450
old "This program is up to date."
new "Эта программа обновлена."
# 00updater.rpy:1425
# 00updater.rpy:1452
old "[u.version] is available. Do you want to install it?"
new "[u.version] доступна. Вы хотите её установить?"
# 00updater.rpy:1427
# 00updater.rpy:1454
old "Preparing to download the updates."
new "Подготовка к загрузке обновлений."
# 00updater.rpy:1429
# 00updater.rpy:1456
old "Downloading the updates."
new "Загрузка обновлений."
# 00updater.rpy:1431
# 00updater.rpy:1458
old "Unpacking the updates."
new "Распаковка обновлений."
# 00updater.rpy:1435
# 00updater.rpy:1462
old "The updates have been installed. The program will restart."
new "Обновления установлены. Программа будет перезапущена."
# 00updater.rpy:1437
# 00updater.rpy:1464
old "The updates have been installed."
new "Обновления были установлены."
# 00updater.rpy:1439
# 00updater.rpy:1466
old "The updates were cancelled."
new "Обновления были отменены."
# 00gallery.rpy:573
# 00gallery.rpy:585
old "Image [index] of [count] locked."
new "Изображение [index] из [count] закрыто."
# 00gallery.rpy:593
# 00gallery.rpy:605
old "prev"
new "пред"
# 00gallery.rpy:594
# 00gallery.rpy:606
old "next"
new "след"
# 00gallery.rpy:595
# 00gallery.rpy:607
old "slideshow"
new "слайд-шоу"
# 00gallery.rpy:596
# 00gallery.rpy:608
old "return"
new "вернуться"
-124
View File
@@ -1,130 +1,6 @@
translate russian strings:
# _developer/developer.rpym:38
old "Developer Menu"
new "Меню разработчика"
# _developer/developer.rpym:43
old "Interactive Director (D)"
new "Интерактивный Директор (D)"
# _developer/developer.rpym:45
old "Reload Game (Shift+R)"
new "Перезагрузить игру (Shift+R)"
# _developer/developer.rpym:47
old "Console (Shift+O)"
new "Консоль (Shift+O)"
# _developer/developer.rpym:49
old "Variable Viewer"
new "Просмотр переменных"
# _developer/developer.rpym:51
old "Image Location Picker"
new "Инструмент позиционирования на изображениях"
# _developer/developer.rpym:53
old "Filename List"
new "Список файлов"
# _developer/developer.rpym:57
old "Show Image Load Log (F4)"
new "Показать лог загрузки изображений (F4)"
# _developer/developer.rpym:60
old "Hide Image Load Log (F4)"
new "Скрыть лог загрузки изображений (F4)"
# _developer/developer.rpym:95
old "Nothing to inspect."
new "Переменные не заданы."
# _developer/developer.rpym:223
old "Return to the developer menu"
new "Вернуться в меню разработчика"
# _developer/developer.rpym:383
old "Rectangle: %r"
new "Прямоугольник: %r"
# _developer/developer.rpym:388
old "Mouse position: %r"
new "Позиция мыши: %r"
# _developer/developer.rpym:393
old "Right-click or escape to quit."
new "Нажмите правую кнопку мыши или ESC чтобы выйти."
# _developer/developer.rpym:425
old "Rectangle copied to clipboard."
new "Координаты прямоугольника скопированы в буфер обмена."
# _developer/developer.rpym:428
old "Position copied to clipboard."
new "Координаты позиции скопированы в буфер обмена."
# _developer/developer.rpym:447
old "Type to filter: "
new "Текущий фильтр: "
# _developer/developer.rpym:575
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Текстур: [tex_count] ([tex_size_mb:.1f] МБ)"
# _developer/developer.rpym:579
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Кеш изображений: [cache_pct:.1f]% ([cache_size_mb:.1f] МБ)"
# _developer/developer.rpym:589
old "✔ "
new "✔ "
# _developer/developer.rpym:592
old "✘ "
new "✘ "
# _developer/developer.rpym:597
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}✔ предсказанное изображение (хорошо){/color}\n{color=#fcc}✘ внезапное изображение (плохо){/color}\n{color=#fff}Нажмите, чтобы передвинуть.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
new "Диспетчер объектов"
# _developer/inspector.rpym:61
old "Size"
new "Разрешение"
# _developer/inspector.rpym:65
old "Style"
new "Стиль"
# _developer/inspector.rpym:71
old "Location"
new "Местоположение"
# _developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "Инспектирую стили [displayable_name!q]"
# _developer/inspector.rpym:139
old "displayable:"
new "объект:"
# _developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (на объект не влияют никакие параметры)"
# _developer/inspector.rpym:147
old " (default properties omitted)"
new " (настройки по умолчанию опущены)"
# _developer/inspector.rpym:185
old "<repr() failed>"
new "<repr() провален>"
# 00console.rpy:255
old "Press <esc> to exit console. Type help for help.\n"
new "Нажмите <esc>, чтобы выйти из консоли. Введите help для помощи.\n"
+18 -18
View File
@@ -141,75 +141,75 @@ translate russian strings:
old "Back (B)"
new "Back (B)"
# _errorhandling.rpym:528
# _errorhandling.rpym:529
old "Open"
new "Журнал"
# _errorhandling.rpym:530
# _errorhandling.rpym:531
old "Opens the traceback.txt file in a text editor."
new "Открывает файл traceback.txt в текстовом редакторе."
# _errorhandling.rpym:532
# _errorhandling.rpym:533
old "Copy"
new "Копировать"
# _errorhandling.rpym:534
# _errorhandling.rpym:535
old "Copies the traceback.txt file to the clipboard."
new "Копирует файл traceback.txt в буфер обмена."
# _errorhandling.rpym:561
# _errorhandling.rpym:562
old "An exception has occurred."
new "Возникло исключение."
# _errorhandling.rpym:581
# _errorhandling.rpym:582
old "Rollback"
new "Назад"
# _errorhandling.rpym:583
# _errorhandling.rpym:584
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Пытается вернуться назад, позволяя вам сохраниться или принять другой выбор."
# _errorhandling.rpym:586
# _errorhandling.rpym:587
old "Ignore"
new "Игнорировать"
# _errorhandling.rpym:590
# _errorhandling.rpym:591
old "Ignores the exception, allowing you to continue."
new "Игнорирует это исключение, позволяя вам продолжить."
# _errorhandling.rpym:592
# _errorhandling.rpym:593
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Игнорирует это исключение, позволяя вам продолжить. Зачастую это ведёт к дополнительным ошибкам."
# _errorhandling.rpym:596
# _errorhandling.rpym:597
old "Reload"
new "Перезагрузить"
# _errorhandling.rpym:598
# _errorhandling.rpym:599
old "Reloads the game from disk, saving and restoring game state if possible."
new "Перезагружает игру с диска, сохраняя и восстанавливая её состояние, если это возможно."
# _errorhandling.rpym:601
# _errorhandling.rpym:602
old "Console"
new "Консоль"
# _errorhandling.rpym:603
# _errorhandling.rpym:604
old "Opens a console to allow debugging the problem."
new "Открывает консоль, позволяющую отладить проблему."
# _errorhandling.rpym:613
# _errorhandling.rpym:614
old "Quits the game."
new "Выходит из игры."
# _errorhandling.rpym:637
# _errorhandling.rpym:638
old "Parsing the script failed."
new "Обработка сценария завершилась неудачно."
# _errorhandling.rpym:663
# _errorhandling.rpym:664
old "Opens the errors.txt file in a text editor."
new "Открывает файл errors.txt в текстовом редакторе."
# _errorhandling.rpym:667
# _errorhandling.rpym:668
old "Copies the errors.txt file to the clipboard."
new "Копирует файл errors.txt в буфер обмена."
+54 -54
View File
@@ -138,7 +138,7 @@ translate russian strings:
new "## Границы окна, содержащего имя персонажа слева, сверху, справа и снизу по порядку."
# gui.rpy:124
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Если True, фон текстового окна будет моститься (расширяться по эффекту плитки). Если False, фон текстового окна будет фиксированным."
# gui.rpy:129
@@ -221,215 +221,215 @@ translate russian strings:
old "## The save slot button."
new "## Кнопка слота сохранения."
# gui.rpy:231
# gui.rpy:233
old "## The width and height of thumbnails used by the save slots."
new "## Ширина и высота миниатюры, используемой слотом сохранения."
# gui.rpy:235
# gui.rpy:237
old "## The number of columns and rows in the grid of save slots."
new "## Количество колонок и рядов в таблице слотов."
# gui.rpy:240
# gui.rpy:242
old "## Positioning and Spacing"
new "## Позиционирование и Интервалы"
# gui.rpy:242
# gui.rpy:244
old "## These variables control the positioning and spacing of various user interface elements."
new "## Эти переменные контролируют позиционирование и интервалы различных элементов пользовательского интерфейса."
# gui.rpy:245
# gui.rpy:247
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## Местоположение левого края навигационных кнопок по отношению к левому краю экрана."
# gui.rpy:249
# gui.rpy:251
old "## The vertical position of the skip indicator."
new "## Вертикальная позиция индикатора пропуска."
# gui.rpy:252
# gui.rpy:254
old "## The vertical position of the notify screen."
new "## Вертикальная позиция экрана уведомлений."
# gui.rpy:255
# gui.rpy:257
old "## The spacing between menu choices."
new "## Интервал между выборами в меню."
# gui.rpy:258
# gui.rpy:260
old "## Buttons in the navigation section of the main and game menus."
new "## Кнопки в секции навигации главного и игрового меню."
# gui.rpy:261
# gui.rpy:263
old "## Controls the amount of spacing between preferences."
new "## Контролирует интервал между настройками."
# gui.rpy:264
# gui.rpy:266
old "## Controls the amount of spacing between preference buttons."
new "## Контролирует интервал между кнопками настройки."
# gui.rpy:267
# gui.rpy:269
old "## The spacing between file page buttons."
new "## Интервал между кнопками страниц."
# gui.rpy:270
# gui.rpy:272
old "## The spacing between file slots."
new "## Интервал между слотами."
# gui.rpy:273
# gui.rpy:275
old "## The position of the main menu text."
new "## Позиция текста главного меню."
# gui.rpy:277
# gui.rpy:279
old "## Frames"
new "## Рамки"
# gui.rpy:279
# gui.rpy:281
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## Эти переменные контролируют вид рамок, содержащих компоненты пользовательского интерфейса, когда наложения или окна не представлены."
# gui.rpy:282
# gui.rpy:284
old "## Generic frames."
new "## Генерируем рамки."
# gui.rpy:285
# gui.rpy:287
old "## The frame that is used as part of the confirm screen."
new "## Рамки, используемые в частях экрана подтверждения."
# gui.rpy:288
# gui.rpy:290
old "## The frame that is used as part of the skip screen."
new "## Рамки, используемые в частях экрана пропуска."
# gui.rpy:291
# gui.rpy:293
old "## The frame that is used as part of the notify screen."
new "## Рамки, используемые в частях экрана уведомлений."
# gui.rpy:294
# gui.rpy:296
old "## Should frame backgrounds be tiled?"
new "## Должны ли фоны рамок моститься?"
# gui.rpy:298
# gui.rpy:300
old "## Bars, Scrollbars, and Sliders"
new "## Панели, Полосы прокрутки и Ползунки"
# gui.rpy:300
# gui.rpy:302
old "## These control the look and size of bars, scrollbars, and sliders."
new "## Эти настройки контролируют вид и размер панелей, полос прокрутки и ползунков."
# gui.rpy:302
# gui.rpy:304
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
new "## Стандартный GUI использует только ползунки и вертикальные полосы прокрутки. Все остальные полосы используются только в новосозданных экранах."
# gui.rpy:305
# gui.rpy:307
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Высота горизонтальных панелей, полос прокрутки и ползунков. Ширина вертикальных панелей, полос прокрутки и ползунков."
# gui.rpy:311
# gui.rpy:313
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## True, если изображения панелей должны моститься. False, если они должны быть линейно масштабированы."
# gui.rpy:316
# gui.rpy:318
old "## Horizontal borders."
new "## Горизонтальные границы."
# gui.rpy:321
# gui.rpy:323
old "## Vertical borders."
new "## Вертикальные границы."
# gui.rpy:326
# gui.rpy:328
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## Что делать с непрокручиваемыми полосами прокрутки в интерфейсе. \"hide\" прячет их, а None их показывает."
# gui.rpy:331
# gui.rpy:333
old "## History"
new "## История"
# gui.rpy:333
# gui.rpy:335
old "## The history screen displays dialogue that the player has already dismissed."
new "## Экран истории показывает диалог, который игрок уже прошёл."
# gui.rpy:335
# gui.rpy:337
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## Количество диалоговых блоков истории, которые Ren'Py будет хранить."
# gui.rpy:338
# gui.rpy:340
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## Высота доступных записей на экране истории, или None, чтобы задать высоту в зависимости от производительности."
# gui.rpy:342
# gui.rpy:344
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Местоположение, ширина и выравнивание заголовка, показывающего имя говорящего персонажа."
# gui.rpy:349
# gui.rpy:351
old "## The position, width, and alignment of the dialogue text."
new "## Местоположение, ширина и выравнивание диалогового текста."
# gui.rpy:356
# gui.rpy:358
old "## NVL-Mode"
new "## Режим NVL"
# gui.rpy:358
# gui.rpy:360
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## Экран режима NVL показывает диалог NVL персонажей."
# gui.rpy:360
# gui.rpy:362
old "## The borders of the background of the NVL-mode background window."
new "## Границы фона окна NVL."
# gui.rpy:363
# gui.rpy:365
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 "## Максимальное число показываемых строк в режиме NVL. Когда количество строчек начинает превышать это значение, старые строчки очищаются."
# gui.rpy:367
# gui.rpy:369
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## Высота доступных строчек в режиме NVL. Установите на None, чтобы строчки динамически регулировали свою высоту."
# gui.rpy:371
# gui.rpy:373
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## Интервал между строчками в режиме NVL, если gui.nvl_height имеет значение None, а также между строчками и меню режима NVL."
# gui.rpy:388
# gui.rpy:390
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## Местоположение, ширина и выравнивание текста nvl_thought (текст от лица персонажа nvl_narrator)."
# gui.rpy:395
# gui.rpy:397
old "## The position of nvl menu_buttons."
new "## Местоположение кнопок меню NVL."
# gui.rpy:399
# gui.rpy:401
old "## Localization"
new "## Локализация"
# gui.rpy:401
# gui.rpy:403
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 "## Эта настройка контролирует доступ к разрыву линий. Стандартная настройка подходит для большинства языков. Список доступных значений можно найти на https://www.renpy.org/doc/html/style_properties.html#style-property-language"
# gui.rpy:409
# gui.rpy:411
old "## Mobile devices"
new "## Мобильные устройства"
# gui.rpy:414
# gui.rpy:416
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## Этот параметр увеличивает размер быстрых кнопок, чтобы сделать их доступнее для нажатия на планшетах и телефонах."
# gui.rpy:420
# gui.rpy:422
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## Это изменяет размеры и интервалы различных элементов GUI, чтобы убедиться, что они будут лучше видны на телефонах."
# gui.rpy:424
# gui.rpy:426
old "## Font sizes."
new "## Размеры шрифтов."
# gui.rpy:432
# gui.rpy:434
old "## Adjust the location of the textbox."
new "## Регулирует местоположение текстового окна."
# gui.rpy:438
# gui.rpy:440
old "## Change the size and spacing of various things."
new "## Изменяет размеры и интервалы различных объектов."
# gui.rpy:451
# gui.rpy:453
old "## File button layout."
new "## Местоположение кнопок слотов."
# gui.rpy:455
# gui.rpy:457
old "## NVL-mode."
new "## Режим NVL."
+380 -145
View File
@@ -34,8 +34,8 @@ translate russian strings:
new "Чтобы построить Android-пакет, пожалуйста, загрузите RAPT, разархивируйте его и поместить в директорию Ren'Py. Затем перезагрузите лаунчер Ren'Py."
# android.rpy:31
old "An x86 Java 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."
new "Чтобы построить Android-пакеты на Windows требуется 32-разрядный инструментарий разработки Java. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=httpу://www.oracle.com/technetwork/java/javase/downloads/index.html}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
old "A 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."
new "Чтобы построить Android-пакеты на Windows требуется инструментарий разработки Java 8. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
@@ -90,112 +90,344 @@ translate russian strings:
new "Собирает Android-пакет, устанавливает его на Android-устройстве, подключённом к компьютеру, а затем запускает приложение на устройстве."
# android.rpy:48
old "Connects to an Android device running ADB in TCP/IP mode."
new "Присоединение к Android-устройству с запущенным Android Debug Bridge в режиме TCP/IP."
# android.rpy:49
old "Disconnects from an Android device running ADB in TCP/IP mode."
new "Отсоединение от Android-устройства с запущенным Android Debug Bridge в режиме TCP/IP."
old "Retrieves the log from the Android device and writes it to a file."
new "Берёт лог с Андроид-устройства и пишет его в файл."
# android.rpy:50
old "Retrieves the log from the Android device and writes it to a file."
new "Берёт лог с Android-устройства и пишет его в файл."
old "Selects the Debug build, which can be accessed through Android Studio. Changing between debug and release builds requires an uninstall from your device."
new "Выбор сборки Отладки, доступной для Android Studio. Смена режимов между отладкой и релизом требует предварительного удаления приложения с вашего устройства."
# android.rpy:244
# android.rpy:51
old "Selects the Release build, which can be uploaded to stores. Changing between debug and release builds requires an uninstall from your device."
new "Выбор сборки Релиза, которую можно загружать в магазины приложений. Смена режимов между отладкой и релизом требует предварительного удаления приложения с вашего устройства."
# android.rpy:245
old "Copying Android files to distributions directory."
new "Копирую файлы Android в директорию дистрибутивов."
# android.rpy:308
# android.rpy:313
old "Android: [project.current.display_name!q]"
new "Android: [project.current.display_name!q]"
# android.rpy:328
# android.rpy:333
old "Emulation:"
new "Эмуляция:"
# android.rpy:337
# android.rpy:342
old "Phone"
new "Телефон"
# android.rpy:341
# android.rpy:346
old "Tablet"
new "Планшет"
# android.rpy:345
# android.rpy:350
old "Television"
new "Телевизор"
# android.rpy:357
# android.rpy:362
old "Build:"
new "Собрать:"
# android.rpy:365
# android.rpy:373
old "Debug"
new "Отладку"
# android.rpy:377
old "Release"
new "Релиз"
# android.rpy:384
old "Install SDK & Create Keys"
new "Установить SDK и создать ключи"
# android.rpy:369
# android.rpy:388
old "Configure"
new "Настроить"
# android.rpy:373
# android.rpy:392
old "Build Package"
new "Собрать Пакет"
# android.rpy:377
# android.rpy:396
old "Build & Install"
new "Собрать и Установить"
# android.rpy:381
# android.rpy:400
old "Build, Install & Launch"
new "Собрать, Установить и Запустить"
# android.rpy:392
# android.rpy:411
old "Other:"
new "Другое:"
# android.rpy:400
old "Remote ADB Connect"
new "Удалённое Соединение с ADB"
# android.rpy:404
old "Remote ADB Disconnect"
new "Удалённое Отсоединение от ADB"
# android.rpy:408
# android.rpy:419
old "Logcat"
new "Logcat"
# android.rpy:441
# android.rpy:452
old "Before packaging Android apps, you'll need to download RAPT, the Ren'Py Android Packaging Tool. Would you like to download RAPT now?"
new "Перед тем как собирать приложения Android, вам нужно загрузить RAPT, инструмент Ren'Py для сбора пакетов Android. Хотите загрузить RAPT сейчас?"
new "Перед упаковкой приложений Android вам нужно загрузить RAPT, инструмент упаковки Ren'Py Android. Желаете загрузить RAPT сейчас?"
# android.rpy:500
old "Remote ADB Address"
new "Удалённый адрес ADB"
# android.rpy:500
old "Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."
new "Пожалуйста, введите IP-адрес и номер порта, чтобы соединиться с устройством, по форме \"192.168.1.143:5555\". Ознакомьтесь с документацией своего устройства, чтобы определить поддерживает ли оно удалённый ADB, и если так, адрес и порт для использования."
# android.rpy:512
old "Invalid remote ADB address"
new "Неверный адрес удалённого ADB"
# android.rpy:512
old "The address must contain one exactly one ':'."
new "Адрес должен содержать один, только один ':'."
# android.rpy:516
old "The host may not contain whitespace."
new "Хост не может содержать пробелы."
# android.rpy:522
old "The port must be a number."
new "Порт должен содержать только цифры."
# android.rpy:548
# android.rpy:505
old "Retrieving logcat information from device."
new "Извлекаю информацию logcat из устройства."
new "Извлекаю информацию logcat с устройства."
# androidstrings.rpy:7
old "{} is not a directory."
new "{} - не папка."
# androidstrings.rpy:8
old "{} does not contain a Ren'Py game."
new "{} не содержит игру Ren'Py."
# androidstrings.rpy:9
old "Run configure before attempting to build the app."
new "Запуск настройки перед попыткой постройки приложения."
# androidstrings.rpy:10
old "Google Play support is enabled, but build.google_play_key is not defined."
new "Поддержка Google Play включена, однако переменная build.google_play_key не определена."
# androidstrings.rpy:11
old "Updating project."
new "Обновляю проект"
# androidstrings.rpy:12
old "Creating assets directory."
new "Создаю директорию ресурсов"
# androidstrings.rpy:13
old "Creating expansion file."
new "Создаю файл-расширение"
# androidstrings.rpy:14
old "Packaging internal data."
new "Пакую внутренние данные"
# androidstrings.rpy:15
old "I'm using Gradle to build the package."
new "Использую Gradle для сборки пакета"
# androidstrings.rpy:16
old "Uploading expansion file."
new "Загружаю файл-расширение"
# androidstrings.rpy:17
old "The build seems to have failed."
new "Ой, ошибка со сборкой приключилась..."
# androidstrings.rpy:18
old "Launching app."
new "Запускаю приложение"
# androidstrings.rpy:19
old "The build seems to have succeeded."
new "Кажется, сборка прошла успешно!"
# androidstrings.rpy:20
old "What is the full name of your application? This name will appear in the list of installed applications."
new "Каким будет полное имя вашего приложения? Это имя будет представлено в списке установленных приложений."
# androidstrings.rpy:21
old "What is the short name of your application? This name will be used in the launcher, and for application shortcuts."
new "Каким будет короткое имя вашего приложения? Это имя будет использоваться в лаунчере, а также ярлыках приложения."
# androidstrings.rpy:22
old "What is the name of the package?\n\nThis is usually of the form com.domain.program or com.domain.email.program. It may only contain ASCII letters and dots. It must contain at least one dot."
new "Каким будет имя собранного пакета?\n\nОбычно оно имеет форму com.domain.program или com.domain.email.program. Имя может содержать только символы ASCII и точки. Также оно должно содержать хотя бы одну точку."
# androidstrings.rpy:23
old "The package name may not be empty."
new "Имя пакета не может быть пустым."
# androidstrings.rpy:24
old "The package name may not contain spaces."
new "В имени пакета не должно быть пробелов."
# androidstrings.rpy:25
old "The package name must contain at least one dot."
new "Имя пакета должно содержать как минимум одну точку."
# androidstrings.rpy:26
old "The package name may not contain two dots in a row, or begin or end with a dot."
new "Имя пакета не должно содержать две и более точек подряд, или начинаться и заканчиваться с точки."
# androidstrings.rpy:27
old "Each part of the package name must start with a letter, and contain only letters, numbers, and underscores."
new "Каждая часть имя пакета должна начинаться с буквы и содержать только английские буквы, цифры и подчёркивания."
# androidstrings.rpy:28
old "{} is a Java keyword, and can't be used as part of a package name."
new "{} - оператор Java, его нельзя использовать в имени пакета."
# androidstrings.rpy:29
old "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."
new "Какой будет версия приложения?\n\nВерсия приложения представлена для человека и независима от config.version. Она может содержать только цифры и точки."
# androidstrings.rpy:30
old "The version number must contain only numbers and dots."
new "Номер версии должен содержать только цифры и точки."
# androidstrings.rpy:31
old "What is the version code?\n\nThis must be a positive integer number, and the value should increase between versions."
new "Каким будет код версии?\n\nЭто должно быть положительное целое число, и его значение должно увеличиваться с каждой версией."
# androidstrings.rpy:32
old "The numeric version must contain only numbers."
new "Целое версии должно содержать только цифры."
# androidstrings.rpy:33
old "How would you like your application to be displayed?"
new "В какой ориентации экрана вы хотите отображать ваше приложение?"
# androidstrings.rpy:34
old "In landscape orientation."
new "В альбомном виде."
# androidstrings.rpy:35
old "In portrait orientation."
new "В портретном виде."
# androidstrings.rpy:36
old "In the user's preferred orientation."
new "По желанию пользователя."
# androidstrings.rpy:37
old "Which app store would you like to support in-app purchasing through?"
new "Через какой магазин приложений вы желаете поддерживать микротранзакции внутри приложения?"
# androidstrings.rpy:38
old "Google Play."
new "Google Play."
# androidstrings.rpy:39
old "Amazon App Store."
new "Магазин приложений Amazon."
# androidstrings.rpy:40
old "Both, in one app."
new "Оба, в одном приложении."
# androidstrings.rpy:41
old "Neither."
new "Отключить."
# androidstrings.rpy:42
old "Would you like to create an expansion APK?"
new "Желаете создать пакет в формате APK+кэш?"
# androidstrings.rpy:43
old "No. Size limit of 100 MB on Google Play, but can be distributed through other stores and sideloaded."
new "Нет. Ограничение по размеру в Google Play - 100 МБ, но может распространяться через другие магазины или локально."
# androidstrings.rpy:44
old "Yes. 2 GB size limit, but won't work outside of Google Play. (Read the documentation to get this to work.)"
new "Да. Ограничение в 2 ГБ, но не будет работать вне среды Google Play. (Ознакомьтесь с {a=https://renpy.org/doc/html/android.html?highlight=apk#google-play-expansion-apks}документацией{/a})"
# androidstrings.rpy:45
old "Do you want to allow the app to access the Internet?"
new "Желаете разрешить вашему приложению доступ в Интернет?"
# androidstrings.rpy:46
old "Do you want to automatically update the generated project?"
new "Желаете автоматически обновлять сгенерированный проект?"
# androidstrings.rpy:47
old "Yes. This is the best choice for most projects."
new "Да. Это лучшее решение для большинства проектов."
# androidstrings.rpy:48
old "No. This may require manual updates when Ren'Py or the project configuration changes."
new "Нет. Это решение может потребовать ручных обновлений при изменении Ren'Py или конфигурации проекта."
# androidstrings.rpy:49
old "Unknown configuration variable: {}"
new "Неизвестная конфигурационная переменная: {}"
# androidstrings.rpy:50
old "I'm compiling a short test program, to see if you have a working JDK on your system."
new "Сейчас я компилирую небольшую тестовую программу, чтобы убедиться, что в вашей системе есть работающий JDK."
# androidstrings.rpy:51
old "I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\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."
new "Я не смогла воспользоваться javac для компиляции тестового файла. Если у вас не установлен Инструментарий Разработки Java, пожалуйста, загрузите его с:\n\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\n\nJDK отличается от JRE, так что есть вероятность, что у вас установлена Java без JDK. Без функционирующего JDK я не могу продолжить."
# androidstrings.rpy:52
old "The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\n\nYou can also set the JAVA_HOME environment variabe to use a different version of Java."
new "Судя по всему, версия Java на вашем компьютере - не JDK 8, единственная версия, поддерживаемая Android SDK. Если вам нужно установить JDK 8, вы можете скачать его с:\n\nhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html\n\nТакже вы можете изменить переменную окружения JAVA_HOME, чтобы воспользоваться другой версией Java."
# androidstrings.rpy:53
old "The JDK is present and working. Good!"
new "JDK найден и работает. Отлично!"
# androidstrings.rpy:54
old "The Android SDK has already been unpacked."
new "Android SDK уже распакован."
# androidstrings.rpy:55
old "Do you accept the Android SDK Terms and Conditions?"
new "Вы принимаете условияя и положения пользования Android SDK?"
# androidstrings.rpy:56
old "I'm downloading the Android SDK. This might take a while."
new "Загружаю Android SDK. Это может занять некоторое время."
# androidstrings.rpy:57
old "I'm extracting the Android SDK."
new "Извлекаю Android SDK."
# androidstrings.rpy:58
old "I've finished unpacking the Android SDK."
new "Извлечение Android SDK завершено."
# androidstrings.rpy:59
old "I'm about to download and install the required Android packages. This might take a while."
new "Начинаю загрузку и установку необходимых пакетов Android. Это может занять время."
# androidstrings.rpy:60
old "I was unable to accept the Android licenses."
new "Внимание, не удалось принять соглашения Android!"
# androidstrings.rpy:61
old "I was unable to install the required Android packages."
new "Установка необходимых пакетов Android не удалась!"
# androidstrings.rpy:62
old "I've finished installing the required Android packages."
new "Заканчиваю установку необходимых пакетов Android."
# androidstrings.rpy:63
old "You set the keystore yourself, so I'll assume it's how you want it."
new "Вы сами установили хранилище ключей, так что посмею предположить, что оно настроено так, как вы хотите."
# androidstrings.rpy:64
old "You've already created an Android keystore, so I won't create a new one for you."
new "Вы уже создали хранилище ключей Android, так что я не буду создавать для вас новое."
# androidstrings.rpy:65
old "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?"
new "Я могу создать для вас ключ для подписи приложения. Подпись приложения этим ключом позволит разместить его в Android Market и других магазинах приложений.\n\nХотите создать ключ?"
# androidstrings.rpy:66
old "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?"
new "Я создам ключ в файле android.keystore.\n\nВам нужно сохранить этот файл. Если вы его потеряете, то не сможете обновлять ваше приложение. n.\n\n\\Также вам нужно держать ваш ключ в безопасность. Если злоумышленникам удастся получить его, они потенциально могут создать вредоносную версию приложения и красть данные ваших пользователей.\n\nБудете ли вы хранить android.keystore и держать его в надёжном месте?"
# androidstrings.rpy:67
old "Please enter your name or the name of your organization."
new "Пожалуйста, введите ваше имя или имя вашей организации."
# androidstrings.rpy:68
old "Could not create android.keystore. Is keytool in your path?"
new "Не могу создать android.keystore. Хранилище ключей расположено в вашем пути файлов?"
# androidstrings.rpy:69
old "I've finished creating android.keystore. Please back it up, and keep it in a safe place."
new "Создание android.keystore завершено. Пожалуйста, сохраните его и держите в надёжном месте."
# androidstrings.rpy:70
old "It looks like you're ready to start packaging games."
new "Похоже, вы готовы собирать игры!"
# choose_directory.rpy:87
old "Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."
@@ -569,75 +801,75 @@ translate russian strings:
old "Please click on the color scheme you wish to use, then click Continue. These colors can be changed and customized later."
new "Пожалуйста, кликните на цветовую схему, которую вы хотите использовать, а затем кликните Продолжить. Эти цвета можно изменить позже."
# gui7.rpy:310
# gui7.rpy:311
old "{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?"
new "{b}Внимание{/b}\nПродолжив, вы перепишете настроенные полосы, кнопки, слоты сохранения, полосы прокрутки и ползунки.\n\nЧто вы хотите сделать?"
# gui7.rpy:310
# gui7.rpy:311
old "Choose new colors, then regenerate image files."
new "Выбрать новые цвета, затем воссоздать файлы изображений."
# gui7.rpy:310
# gui7.rpy:311
old "Regenerate the image files using the colors in gui.rpy."
new "Воссоздать файлы изображений используя цвета из gui.rpy."
# gui7.rpy:330
# gui7.rpy:331
old "PROJECT NAME"
new "ИМЯ ПРОЕКТА"
# gui7.rpy:330
# gui7.rpy:331
old "Please enter the name of your project:"
new "Пожалуйста, введите имя проекта:"
# gui7.rpy:338
# gui7.rpy:339
old "The project name may not be empty."
new "Имя проекта не должно быть пустым."
# gui7.rpy:343
# gui7.rpy:344
old "[project_name!q] already exists. Please choose a different project name."
new "[project_name!q] уже существует. Выберите другое имя проекта."
# gui7.rpy:346
# gui7.rpy:347
old "[project_dir!q] already exists. Please choose a different project name."
new "[project_dir!q] уже существует. Выберите другое имя проекта."
# gui7.rpy:357
# gui7.rpy:358
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."
new "Какое разрешение будет использовать ваш проект? Хотя Ren'Py может масштабировать окно, это будет целевой размер окна, по отношению к которому будут вырисовываться ресурсы, и на котором они будут наиболее чёткие.\n\nСтандартный 1280x720 — резонный компромисс."
# gui7.rpy:357
# gui7.rpy:358
old "Custom. The GUI is optimized for a 16:9 aspect ratio."
new "Своё. GUI оптимизирован под соотношение сторон 16:9."
# gui7.rpy:372
# gui7.rpy:373
old "WIDTH"
new "ШИРИНА"
# gui7.rpy:372
# gui7.rpy:373
old "Please enter the width of your game, in pixels."
new "Пожалуйста, введите ширину вашей игры в пикселях."
# gui7.rpy:377
# gui7.rpy:378
old "The width must be a number."
new "Ширина должна быть цифрой."
# gui7.rpy:379
# gui7.rpy:380
old "HEIGHT"
new "ВЫСОТА"
# gui7.rpy:379
# gui7.rpy:380
old "Please enter the height of your game, in pixels."
new "Пожалуйста, введите высоту вашей игры в пикселях."
# gui7.rpy:384
# gui7.rpy:385
old "The height must be a number."
new "Высота должна быть цифрой."
# gui7.rpy:426
# gui7.rpy:427
old "Creating the new project..."
new "Создаю новый проект..."
# gui7.rpy:428
# gui7.rpy:429
old "Updating the project..."
new "Обновляю проект..."
@@ -821,7 +1053,7 @@ translate russian strings:
old "Please {a=https://itch.io/game/new}create your project{/a}, then add a line like \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} to options.rpy."
new "Пожалуйста, {a=https://itch.io/game/new}создайте ваш проект{/a}, затем добавьте строку типа\n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} в options.rpy."
# mobilebuild.rpy:109
# mobilebuild.rpy:110
old "{a=%s}%s{/a}"
new "{a=%s}%s{/a}"
@@ -829,7 +1061,7 @@ translate russian strings:
old "Navigate: [project.current.display_name!q]"
new "Навигация: [project.current.display_name!q]"
# navigation.rpy:177
# navigation.rpy:178
old "Order: "
new "Порядок: "
@@ -933,91 +1165,87 @@ translate russian strings:
old "Please select a template to use for your new project. The template sets the default font and the user interface language. If your language is not supported, choose 'english'."
new "Пожалуйста, выберите образец, на котором основывать ваш проект. Образец задаёт шрифт и язык по умолчанию для интерфейса. Если ваш язык не поддерживается, выберите 'english'."
# preferences.rpy:72
# preferences.rpy:73
old "Launcher Preferences"
new "Настройки лаунчера"
# preferences.rpy:93
# preferences.rpy:94
old "Projects Directory:"
new "Папка проектов:"
# preferences.rpy:100
# preferences.rpy:101
old "[persistent.projects_directory!q]"
new "[persistent.projects_directory!q]"
# preferences.rpy:102
# preferences.rpy:103
old "Projects directory: [text]"
new "Папка проектов: [text]"
# preferences.rpy:104
# preferences.rpy:105
old "Not Set"
new "Не задано"
# preferences.rpy:119
# preferences.rpy:120
old "Text Editor:"
new "Текстовый редактор:"
# preferences.rpy:125
# preferences.rpy:126
old "Text editor: [text]"
new "Текстовый редактор: [text]"
# preferences.rpy:141
old "Update Channel:"
new "Канал обновлений:"
# preferences.rpy:161
# preferences.rpy:145
old "Navigation Options:"
new "Опции навигации:"
# preferences.rpy:165
# preferences.rpy:149
old "Include private names"
new "Включать приватные имена"
# preferences.rpy:166
# preferences.rpy:150
old "Include library names"
new "Включать имена библиотек"
# preferences.rpy:176
# preferences.rpy:160
old "Launcher Options:"
new "Опции лаунчера:"
# preferences.rpy:180
# preferences.rpy:164
old "Hardware rendering"
new "Аппаратный рендеринг"
# preferences.rpy:181
# preferences.rpy:165
old "Show edit file section"
new "Показывать секцию редактирования"
# preferences.rpy:182
# preferences.rpy:166
old "Large fonts"
new "Большие шрифты"
# preferences.rpy:185
# preferences.rpy:169
old "Console output"
new "Вывод на консоль"
# preferences.rpy:187
# preferences.rpy:173
old "Force new tutorial"
new "Новое обучение"
# preferences.rpy:189
# preferences.rpy:177
old "Legacy options"
new "Включить старые темы"
# preferences.rpy:192
# preferences.rpy:180
old "Show templates"
new "Показывать образцы"
# preferences.rpy:194
# preferences.rpy:182
old "Sponsor message"
new "Сообщение спонсорам"
# preferences.rpy:214
# preferences.rpy:202
old "Open launcher project"
new "Открыть проект лаунчера"
# preferences.rpy:228
# preferences.rpy:216
old "Language:"
new "Язык:"
@@ -1037,35 +1265,35 @@ translate russian strings:
old "Have you backed up your projects recently?"
new "Давно сохраняли свои проекты?"
# project.rpy:280
# project.rpy:281
old "Launching the project failed."
new "Запуск проекта провален."
# project.rpy:280
# project.rpy:281
old "Please ensure that your project launches normally before running this command."
new "Пожалуйста, убедитесь, что ваш проект нормально запускается перед использованием этой команды."
# project.rpy:296
# project.rpy:297
old "Ren'Py is scanning the project..."
new "Ren'Py сканирует проект..."
# project.rpy:725
# project.rpy:729
old "Launching"
new "Запускаю"
# project.rpy:759
# project.rpy:763
old "PROJECTS DIRECTORY"
new "ДИРЕКТОРИЯ ПРОЕКТОВ"
# project.rpy:759
# project.rpy:763
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "Пожалуйста, выберите директорию проектов, используя выборщик директорий.\n{b}Он мог появиться позади этого окна.{/b}"
# project.rpy:759
# project.rpy:763
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "Лаунчер будет искать проекты в этой директории, создавать новые проекты в этой директории, и размещать построенные проекты в этой директории."
# project.rpy:764
# project.rpy:768
old "Ren'Py has set the projects directory to:"
new "Ren'Py установила директорию проектов на:"
@@ -1173,95 +1401,102 @@ translate russian strings:
old "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[persistent.dialogue_format] in the base directory."
new "Ren'Py завершила извлечение диалога. Извлечённый диалог можно найти в файле dialogue.[persistent.dialogue_format] в директории проекта."
# updater.rpy:75
old "Select Update Channel"
new "Выберите канал обновлений"
# updater.rpy:86
old "The update channel controls the version of Ren'Py the updater will download. Please select an update channel:"
new "Канал обновлений выбирает, какую версию Ren'Py скачает программа для обновления. Выберите канал:"
# updater.rpy:91
old "Release"
new "Релиз"
# updater.rpy:97
# updater.rpy:63
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
new "{b}Рекомендуется.{/b} Эта версия Ren'Py должна использоваться для всех новых игр."
# updater.rpy:102
# updater.rpy:65
old "Prerelease"
new "Пререлиз"
# updater.rpy:108
# updater.rpy:66
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
new "Публичный анонс следующей версии Ren'Py, который можно использовать для тестирования, в том числе новых возможностей Ren'Py, но не для финальных релизов игр."
# updater.rpy:114
# updater.rpy:68
old "Experimental"
new "Экспериментальный"
# updater.rpy:120
# updater.rpy:69
old "Experimental versions of Ren'Py. You shouldn't select this channel unless asked by a Ren'Py developer."
new "Экспериментальные версии Ren'Py. Не выбирайте этот канал, если вас не просил об этом разработчик Ren'Py."
# updater.rpy:126
# updater.rpy:71
old "Nightly"
new "Ночной"
# updater.rpy:132
# updater.rpy:72
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Развитие Ren'Py на краю горизонта событий. Здесь можно найти новейшие возможности Ren'Py или всё может просто не запуститься."
# updater.rpy:152
# updater.rpy:90
old "Select Update Channel"
new "Выберите канал обновлений"
# updater.rpy:101
old "The update channel controls the version of Ren'Py the updater will download."
new "Канал обновлений отвечает за версию Ren'Py, скачиваемую через обновление."
# updater.rpy:110
old "• This version is installed and up-to-date."
new "• На данный момент установлена эта версия."
# updater.rpy:118
old "%B %d, %Y"
new "%B %d, %Y"
# updater.rpy:140
old "An error has occured:"
new "Возникла ошибка:"
# updater.rpy:154
# updater.rpy:142
old "Checking for updates."
new "Проверка обновлений."
# updater.rpy:156
# updater.rpy:144
old "Ren'Py is up to date."
new "Ren'Py обновлена."
# updater.rpy:158
# updater.rpy:146
old "[u.version] is now available. Do you want to install it?"
new "[u.version] доступна. Вы хотите её установить?"
# updater.rpy:160
# updater.rpy:148
old "Preparing to download the update."
new "Подготовка к обновлению."
# updater.rpy:162
# updater.rpy:150
old "Downloading the update."
new "Загрузка обновления."
# updater.rpy:164
# updater.rpy:152
old "Unpacking the update."
new "Распаковка обновления."
# updater.rpy:166
# updater.rpy:154
old "Finishing up."
new "Завершаю..."
# updater.rpy:168
# updater.rpy:156
old "The update has been installed. Ren'Py will restart."
new "Обновление было установлено. Ren'Py будет перезапущена."
# updater.rpy:170
# updater.rpy:158
old "The update has been installed."
new "Обновление было установлено."
# updater.rpy:172
# updater.rpy:160
old "The update was cancelled."
new "Обновление было отменено."
# updater.rpy:189
# updater.rpy:177
old "Ren'Py Update"
new "Обновление Ren'Py"
# updater.rpy:195
# updater.rpy:183
old "Proceed"
new "Продолжить"
# updater.rpy:188
old "Fetching the list of update channels"
new "Запрашиваю список каналов обновления"
-27
View File
@@ -1,27 +0,0 @@
translate russian strings:
# _layout/classic_joystick_preferences.rpym:94
old "Joystick Mapping"
new "Раскладка джойстика"
# _layout/classic_load_save.rpym:138
old "Empty Slot."
new "Пустой слот"
# _layout/classic_load_save.rpym:170
old "a"
new "а"
# _layout/classic_load_save.rpym:179
old "q"
new "б"
# _compat/gamemenu.rpym:355
old "Previous"
new "Назад"
# _compat/gamemenu.rpym:362
old "Next"
new "Далее"
+2 -2
View File
@@ -205,7 +205,7 @@ translate russian strings:
old "## Reserve space for the navigation section."
new "## Резервирует пространство для навигации."
# screens.rpy:471
# screens.rpy:473
old "Return"
new "Вернуться"
@@ -297,7 +297,7 @@ translate russian strings:
old "{#auto_page}A"
new "{#auto_page}А"
# screens.rpy:667
# screens.rpy:669
old "{#quick_page}Q"
new "{#quick_page}Б"
+2 -2
View File
@@ -138,8 +138,8 @@ translate simplified_chinese strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+2 -2
View File
@@ -138,7 +138,7 @@ translate spanish strings:
new "## Los bordes de la caja que contiene el nombre del personaje, en orden: izquierda, arriba, derecha, abajo."
# gui.rpy:124
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Si es 'True, el fondo de la caja del nombre será en mosaico, si es 'False', el fondo, si la caja del nombre es escalada."
# gui.rpy:129
@@ -159,7 +159,7 @@ translate spanish strings:
# gui.rpy:145
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## Estas variables, junto con las imágenes de 'gui/button', controal el aspecto de los botones."
new "## Estas variables, junto con las imágenes de 'gui/button', controla el aspecto de los botones."
# gui.rpy:148
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
+2 -2
View File
@@ -138,8 +138,8 @@ translate traditional_chinese strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+2 -2
View File
@@ -138,8 +138,8 @@ translate vietnamese strings:
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
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."
# 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."
+4 -2
View File
@@ -117,7 +117,7 @@ screen update_channel(channels):
$ date = _strftime(__("%B %d, %Y"), time.localtime(c["timestamp"]))
text "[date] • [c[pretty_version]] [current]" style "l_small_text"
text "[date] • [c[pretty_version]] [current!t]" style "l_small_text"
add HALF_SPACER
@@ -189,8 +189,10 @@ label update:
import urllib2
import json
import ssl
channels = json.load(urllib2.urlopen(CHANNELS_URL))["releases"]
context = ssl._create_unverified_context()
channels = json.load(urllib2.urlopen(CHANNELS_URL, context=context))["releases"]
renpy.call_screen("update_channel", channels)
+5 -5
View File
@@ -21,7 +21,7 @@
from __future__ import print_function
cdef extern from "fribidi/fribidi.h":
cdef extern from "fribidi.h":
int FRIBIDI_TYPE_LTR
int FRIBIDI_TYPE_ON
int FRIBIDI_TYPE_RTL
@@ -29,7 +29,7 @@ cdef extern from "fribidi/fribidi.h":
int FRIBIDI_TYPE_WL
cdef extern from "renpybidicore.h":
object renpybidi_log2vis(object, int *)
object renpybidi_log2vis(unicode, int *)
WLTR = FRIBIDI_TYPE_WL
LTR = FRIBIDI_TYPE_LTR
@@ -37,9 +37,9 @@ ON = FRIBIDI_TYPE_ON
RTL = FRIBIDI_TYPE_RTL
WRTL = FRIBIDI_TYPE_WR
def log2vis(s, int direction=FRIBIDI_TYPE_ON):
s = s.encode("utf8")
def log2vis(unicode s, int direction=FRIBIDI_TYPE_ON):
s = renpybidi_log2vis(s, &direction)
return s.decode("utf8"), direction
return s, direction
+40
View File
@@ -0,0 +1,40 @@
behdad: Behdad Esfahbod <behdad@gnu.org>
#
# Behdad Esfahbod is the only author that actually codes these days. He
# maintains the package too. He has revised all of the code written by
# others, and has written much of the code himself. He's listed (or should
# be listed) on every file in the package as one of the authors. Behdad
# designs, implements, documents, maintains, ...
#
dov-g: Dov Grobgeld <dov@imagic.weizmann.ac.il>
#
# Dov Grobgeld originally wrote FriBidi. The 0.1.* releases were all done
# by him. After that, Dov rarely touched the code, but contributed ideas.
# All files that he has originally authored have him listed as an author in
# the header of the file.
#
roozbeh: Roozbeh Pournader <roozbeh@gnu.org>
#
# Roozbeh Pournader hasn't contributed much code to FriBidi personally; but
# has maintained, promoted, and supported the project for a while. He has
# helped with making GNU FriBidi standards compliant, and has sometimes
# lobbied with the Unicode Consortium when needed. Roozbeh was supposed to
# be a co-maintainer of GNU FriBidi, but he's not doing that yet.
#
#
# Note: Other people have contributed significant amounts of code, but
# usually the code has faded out because of restructuring and redesigning
# things around GNU FriBidi. As an example, the FriBidiEnv patch by Omer
# Zak, made itself into FriBidi CVS for a couple of years, but was finally
# implemented in a better way by Behdad.
#
# Note: GNU getopt is distributed with and used in GNU FriBidi under bin/, but
# is not part of GNU FriBidi.
#
# Note: Parts of the Unicode Character Database are distributed with and used
# in GNU FriBidi under gen.tab/unidata/, but are not part of GNU FriBidi.
#
+340
View File
@@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
+30
View File
@@ -0,0 +1,30 @@
Thanks to:
Behnam Esfahbod <behnam@esfahbod.info>
* Testing and auditing code.
And for the previous versions of FriBidi (pre 2002), thanks to:
Tomas Frydrych <tomas@frydrych.uklinux.net>
* Contirbuted patches for compiling GNU FriBidi under other OSes.
Dov Grobgeld <dov@imagic.weizmann.ac.il>
* Initial author, and maintainer before the 0.9 releases.
Franck Portaneri
* For the Mozilla BiDi languges support document;
Roozbeh Pournader <roozbeh@sharif.edu>
* Fixed things here and there.
Pablo Saratxaga <pablo@mandrakesoft.com>
* Contributed several Arabic charset converters.
Owen Tayler <otaylor@redhat.com>
* Contributed very important memory leak and speed patches.
Omer Zak <omerz@actcom.co.il>
* Contributed several bug fixes, and several considerations for
embedded systems.
+105
View File
@@ -0,0 +1,105 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if you want to include debug code in the library */
#define DEBUG 1
/* Define to 1 if you have the <asm/page.h> header file. */
/* #undef HAVE_ASM_PAGE_H */
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `memmove' function. */
#define HAVE_MEMMOVE 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the `strdup' function. */
#define HAVE_STRDUP 1
/* Define to 1 if cpp supports the ANSI # stringizing operator. */
#define HAVE_STRINGIZE 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/times.h> header file. */
#define HAVE_SYS_TIMES_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the <wchar.h> header file. */
#define HAVE_WCHAR_H 1
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
/* Name of package */
#define PACKAGE "fribidi"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "http://fribidi.org/bug"
/* Define to the full name of this package. */
#define PACKAGE_NAME "GNU FriBidi"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "GNU FriBidi 0.19.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "fribidi"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.19.2"
/* Define as the return type of signal handlers (`int' or `void'). */
#define RETSIGTYPE void
/* The size of `int', as computed by sizeof. */
#define SIZEOF_INT 4
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
/* The size of `void *', as computed by sizeof. */
#define SIZEOF_VOID_P 8
/* The size of `wchar_t', as computed by sizeof. */
#define SIZEOF_WCHAR_T 4
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define to 1 if you want to use simple mallocs instead of memory chunks */
/* #undef USE_SIMPLE_MALLOC */
/* Version number of package */
#define VERSION "0.19.2"
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
+94
View File
@@ -0,0 +1,94 @@
/* The tables in this file should all be sorted on their first item. */
/* *INDENT-OFF* */
const PairMap mandatory_liga_table[] = {
{{0xFEDF, 0xFE82}, 0xFEF5},
{{0xFEDF, 0xFE84}, 0xFEF7},
{{0xFEDF, 0xFE88}, 0xFEF9},
{{0xFEDF, 0xFE8E}, 0xFEFB},
{{0xFEE0, 0xFE82}, 0xFEF6},
{{0xFEE0, 0xFE84}, 0xFEF8},
{{0xFEE0, 0xFE88}, 0xFEFA},
{{0xFEE0, 0xFE8E}, 0xFEFC},
};
const PairMap console_liga_table[] = {
{{0x0640, 0xFC60}, 0xFCF2},
{{0x0640, 0xFC61}, 0xFCF3},
{{0x0640, 0xFC62}, 0xFCF4},
{{0x0640, 0xFE70}, 0xFE71},
{{0x0640, 0xFE76}, 0xFE77},
{{0x0640, 0xFE78}, 0xFE79},
{{0x0640, 0xFE7A}, 0xFE7B},
{{0x0640, 0xFE7C}, 0xFE7D},
{{0x0640, 0xFE7E}, 0xFE7F},
{{0xFBE8, 0x0654}, 0xFE8B},
{{0xFBE9, 0x0654}, 0xFE8C},
{{0xFBFC, 0x0654}, 0xFE89},
{{0xFBFC, 0x0670}, 0xFC5D},
{{0xFBFD, 0x0654}, 0xFE8A},
{{0xFBFD, 0x0670}, 0xFC90},
{{0xFE7C, 0x0670}, 0xFC63},
{{0xFE7C, 0xFE72}, 0xFC5E},
{{0xFE7C, 0xFE74}, 0xFC5F},
{{0xFE7C, 0xFE76}, 0xFC60},
{{0xFE7C, 0xFE78}, 0xFC61},
{{0xFE7C, 0xFE7A}, 0xFC62},
{{0xFE7D, 0xFE76}, 0xFCF2},
{{0xFE7D, 0xFE77}, 0xFCF2},
{{0xFE7D, 0xFE78}, 0xFCF3},
{{0xFE7D, 0xFE79}, 0xFCF3},
{{0xFE7D, 0xFE7A}, 0xFCF4},
{{0xFE7D, 0xFE7B}, 0xFCF4},
{{0xFE8D, 0x0653}, 0xFE81},
{{0xFE8D, 0x0654}, 0xFE83},
{{0xFE8D, 0x0655}, 0xFE87},
{{0xFE8D, 0xFE70}, 0xFD3D},
{{0xFE8E, 0x0653}, 0xFE82},
{{0xFE8E, 0x0654}, 0xFE84},
{{0xFE8E, 0x0655}, 0xFE88},
{{0xFE8E, 0xFE70}, 0xFD3C},
{{0xFEE9, 0x0654}, 0xFBA4},
{{0xFEEA, 0x0654}, 0xFBA5},
{{0xFEED, 0x0654}, 0xFE85},
{{0xFEEE, 0x0654}, 0xFE86},
{{0xFEEF, 0x0654}, 0xFE89},
{{0xFEEF, 0x0670}, 0xFC5D},
{{0xFEF0, 0x0654}, 0xFE8A},
{{0xFEF0, 0x0670}, 0xFC90},
{{0xFEF1, 0x0654}, 0xFE89},
{{0xFEF1, 0x0670}, 0xFC5D},
{{0xFEF2, 0x0654}, 0xFE8A},
{{0xFEF2, 0x0670}, 0xFC90},
{{0xFEF3, 0x0654}, 0xFE8B},
{{0xFEF4, 0x0654}, 0xFE8C},
{{0xFEFB, 0x0653}, 0xFEF5},
{{0xFEFB, 0x0654}, 0xFEF7},
{{0xFEFB, 0x0655}, 0xFEF9},
{{0xFEFC, 0x0653}, 0xFEF6},
{{0xFEFC, 0x0654}, 0xFEF8},
{{0xFEFC, 0x0655}, 0xFEFA},
};
static const FriBidiChar NSMShap[][4] = {
{0xFE70, 0xFE71, 0xFE70, 0xFE71,},
{0xFE72, 0xFE72, 0xFE72, 0xFE72,},
{0xFE74, 0xFE74, 0xFE74, 0xFE74,},
{0xFE76, 0xFE77, 0xFE76, 0xFE77,},
{0xFE78, 0xFE79, 0xFE78, 0xFE79,},
{0xFE7A, 0xFE7B, 0xFE7A, 0xFE7B,},
{0xFE7C, 0xFE7D, 0xFE7C, 0xFE7D,},
{0xFE7E, 0xFE7F, 0xFE7E, 0xFE7F,},
};
/* *INDENT-ON* */
#ifndef FRIBIDI_ACCESS_SHAPE_TABLE
# define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) \
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
#endif
#define FRIBIDI_GET_ARABIC_SHAPE_NSM(x,shape) FRIBIDI_ACCESS_SHAPE_TABLE(NSMShap, 0x064B, 0x0652, (x), (shape))
+205
View File
@@ -0,0 +1,205 @@
/* arabic-shaping.tab.i
* generated by gen-arabic-shaping-tab (GNU FriBidi 0.19.1)
* from the files UnicodeData.txt, (null) of Unicode version 5.1.0. */
/*
use FRIBIDI_GET_ARABIC_SHAPE_PRES(key,shape) to access your table
required memory: 2864
*/
/* *INDENT-OFF* */
static const FriBidiChar ArShap[179][4] = {
{0xfe80,0x0621,0x0621,0x0621,},
{0xfe81,0xfe82,0x0622,0x0622,},
{0xfe83,0xfe84,0x0623,0x0623,},
{0xfe85,0xfe86,0x0624,0x0624,},
{0xfe87,0xfe88,0x0625,0x0625,},
{0xfe89,0xfe8a,0xfe8b,0xfe8c,},
{0xfe8d,0xfe8e,0x0627,0x0627,},
{0xfe8f,0xfe90,0xfe91,0xfe92,},
{0xfe93,0xfe94,0x0629,0x0629,},
{0xfe95,0xfe96,0xfe97,0xfe98,},
{0xfe99,0xfe9a,0xfe9b,0xfe9c,},
{0xfe9d,0xfe9e,0xfe9f,0xfea0,},
{0xfea1,0xfea2,0xfea3,0xfea4,},
{0xfea5,0xfea6,0xfea7,0xfea8,},
{0xfea9,0xfeaa,0x062f,0x062f,},
{0xfeab,0xfeac,0x0630,0x0630,},
{0xfead,0xfeae,0x0631,0x0631,},
{0xfeaf,0xfeb0,0x0632,0x0632,},
{0xfeb1,0xfeb2,0xfeb3,0xfeb4,},
{0xfeb5,0xfeb6,0xfeb7,0xfeb8,},
{0xfeb9,0xfeba,0xfebb,0xfebc,},
{0xfebd,0xfebe,0xfebf,0xfec0,},
{0xfec1,0xfec2,0xfec3,0xfec4,},
{0xfec5,0xfec6,0xfec7,0xfec8,},
{0xfec9,0xfeca,0xfecb,0xfecc,},
{0xfecd,0xfece,0xfecf,0xfed0,},
{0x063b,0x063b,0x063b,0x063b,},
{0x063c,0x063c,0x063c,0x063c,},
{0x063d,0x063d,0x063d,0x063d,},
{0x063e,0x063e,0x063e,0x063e,},
{0x063f,0x063f,0x063f,0x063f,},
{0x0640,0x0640,0x0640,0x0640,},
{0xfed1,0xfed2,0xfed3,0xfed4,},
{0xfed5,0xfed6,0xfed7,0xfed8,},
{0xfed9,0xfeda,0xfedb,0xfedc,},
{0xfedd,0xfede,0xfedf,0xfee0,},
{0xfee1,0xfee2,0xfee3,0xfee4,},
{0xfee5,0xfee6,0xfee7,0xfee8,},
{0xfee9,0xfeea,0xfeeb,0xfeec,},
{0xfeed,0xfeee,0x0648,0x0648,},
{0xfeef,0xfef0,0xfbe8,0xfbe9,},
{0xfef1,0xfef2,0xfef3,0xfef4,},
{0x064b,0x064b,0x064b,0x064b,},
{0x064c,0x064c,0x064c,0x064c,},
{0x064d,0x064d,0x064d,0x064d,},
{0x064e,0x064e,0x064e,0x064e,},
{0x064f,0x064f,0x064f,0x064f,},
{0x0650,0x0650,0x0650,0x0650,},
{0x0651,0x0651,0x0651,0x0651,},
{0x0652,0x0652,0x0652,0x0652,},
{0x0653,0x0653,0x0653,0x0653,},
{0x0654,0x0654,0x0654,0x0654,},
{0x0655,0x0655,0x0655,0x0655,},
{0x0656,0x0656,0x0656,0x0656,},
{0x0657,0x0657,0x0657,0x0657,},
{0x0658,0x0658,0x0658,0x0658,},
{0x0659,0x0659,0x0659,0x0659,},
{0x065a,0x065a,0x065a,0x065a,},
{0x065b,0x065b,0x065b,0x065b,},
{0x065c,0x065c,0x065c,0x065c,},
{0x065d,0x065d,0x065d,0x065d,},
{0x065e,0x065e,0x065e,0x065e,},
{0x065f,0x065f,0x065f,0x065f,},
{0x0660,0x0660,0x0660,0x0660,},
{0x0661,0x0661,0x0661,0x0661,},
{0x0662,0x0662,0x0662,0x0662,},
{0x0663,0x0663,0x0663,0x0663,},
{0x0664,0x0664,0x0664,0x0664,},
{0x0665,0x0665,0x0665,0x0665,},
{0x0666,0x0666,0x0666,0x0666,},
{0x0667,0x0667,0x0667,0x0667,},
{0x0668,0x0668,0x0668,0x0668,},
{0x0669,0x0669,0x0669,0x0669,},
{0x066a,0x066a,0x066a,0x066a,},
{0x066b,0x066b,0x066b,0x066b,},
{0x066c,0x066c,0x066c,0x066c,},
{0x066d,0x066d,0x066d,0x066d,},
{0x066e,0x066e,0x066e,0x066e,},
{0x066f,0x066f,0x066f,0x066f,},
{0x0670,0x0670,0x0670,0x0670,},
{0xfb50,0xfb51,0x0671,0x0671,},
{0x0672,0x0672,0x0672,0x0672,},
{0x0673,0x0673,0x0673,0x0673,},
{0x0674,0x0674,0x0674,0x0674,},
{0x0675,0x0675,0x0675,0x0675,},
{0x0676,0x0676,0x0676,0x0676,},
{0xfbdd,0x0677,0x0677,0x0677,},
{0x0678,0x0678,0x0678,0x0678,},
{0xfb66,0xfb67,0xfb68,0xfb69,},
{0xfb5e,0xfb5f,0xfb60,0xfb61,},
{0xfb52,0xfb53,0xfb54,0xfb55,},
{0x067c,0x067c,0x067c,0x067c,},
{0x067d,0x067d,0x067d,0x067d,},
{0xfb56,0xfb57,0xfb58,0xfb59,},
{0xfb62,0xfb63,0xfb64,0xfb65,},
{0xfb5a,0xfb5b,0xfb5c,0xfb5d,},
{0x0681,0x0681,0x0681,0x0681,},
{0x0682,0x0682,0x0682,0x0682,},
{0xfb76,0xfb77,0xfb78,0xfb79,},
{0xfb72,0xfb73,0xfb74,0xfb75,},
{0x0685,0x0685,0x0685,0x0685,},
{0xfb7a,0xfb7b,0xfb7c,0xfb7d,},
{0xfb7e,0xfb7f,0xfb80,0xfb81,},
{0xfb88,0xfb89,0x0688,0x0688,},
{0x0689,0x0689,0x0689,0x0689,},
{0x068a,0x068a,0x068a,0x068a,},
{0x068b,0x068b,0x068b,0x068b,},
{0xfb84,0xfb85,0x068c,0x068c,},
{0xfb82,0xfb83,0x068d,0x068d,},
{0xfb86,0xfb87,0x068e,0x068e,},
{0x068f,0x068f,0x068f,0x068f,},
{0x0690,0x0690,0x0690,0x0690,},
{0xfb8c,0xfb8d,0x0691,0x0691,},
{0x0692,0x0692,0x0692,0x0692,},
{0x0693,0x0693,0x0693,0x0693,},
{0x0694,0x0694,0x0694,0x0694,},
{0x0695,0x0695,0x0695,0x0695,},
{0x0696,0x0696,0x0696,0x0696,},
{0x0697,0x0697,0x0697,0x0697,},
{0xfb8a,0xfb8b,0x0698,0x0698,},
{0x0699,0x0699,0x0699,0x0699,},
{0x069a,0x069a,0x069a,0x069a,},
{0x069b,0x069b,0x069b,0x069b,},
{0x069c,0x069c,0x069c,0x069c,},
{0x069d,0x069d,0x069d,0x069d,},
{0x069e,0x069e,0x069e,0x069e,},
{0x069f,0x069f,0x069f,0x069f,},
{0x06a0,0x06a0,0x06a0,0x06a0,},
{0x06a1,0x06a1,0x06a1,0x06a1,},
{0x06a2,0x06a2,0x06a2,0x06a2,},
{0x06a3,0x06a3,0x06a3,0x06a3,},
{0xfb6a,0xfb6b,0xfb6c,0xfb6d,},
{0x06a5,0x06a5,0x06a5,0x06a5,},
{0xfb6e,0xfb6f,0xfb70,0xfb71,},
{0x06a7,0x06a7,0x06a7,0x06a7,},
{0x06a8,0x06a8,0x06a8,0x06a8,},
{0xfb8e,0xfb8f,0xfb90,0xfb91,},
{0x06aa,0x06aa,0x06aa,0x06aa,},
{0x06ab,0x06ab,0x06ab,0x06ab,},
{0x06ac,0x06ac,0x06ac,0x06ac,},
{0xfbd3,0xfbd4,0xfbd5,0xfbd6,},
{0x06ae,0x06ae,0x06ae,0x06ae,},
{0xfb92,0xfb93,0xfb94,0xfb95,},
{0x06b0,0x06b0,0x06b0,0x06b0,},
{0xfb9a,0xfb9b,0xfb9c,0xfb9d,},
{0x06b2,0x06b2,0x06b2,0x06b2,},
{0xfb96,0xfb97,0xfb98,0xfb99,},
{0x06b4,0x06b4,0x06b4,0x06b4,},
{0x06b5,0x06b5,0x06b5,0x06b5,},
{0x06b6,0x06b6,0x06b6,0x06b6,},
{0x06b7,0x06b7,0x06b7,0x06b7,},
{0x06b8,0x06b8,0x06b8,0x06b8,},
{0x06b9,0x06b9,0x06b9,0x06b9,},
{0xfb9e,0xfb9f,0x06ba,0x06ba,},
{0xfba0,0xfba1,0xfba2,0xfba3,},
{0x06bc,0x06bc,0x06bc,0x06bc,},
{0x06bd,0x06bd,0x06bd,0x06bd,},
{0xfbaa,0xfbab,0xfbac,0xfbad,},
{0x06bf,0x06bf,0x06bf,0x06bf,},
{0xfba4,0xfba5,0x06c0,0x06c0,},
{0xfba6,0xfba7,0xfba8,0xfba9,},
{0x06c2,0x06c2,0x06c2,0x06c2,},
{0x06c3,0x06c3,0x06c3,0x06c3,},
{0x06c4,0x06c4,0x06c4,0x06c4,},
{0xfbe0,0xfbe1,0x06c5,0x06c5,},
{0xfbd9,0xfbda,0x06c6,0x06c6,},
{0xfbd7,0xfbd8,0x06c7,0x06c7,},
{0xfbdb,0xfbdc,0x06c8,0x06c8,},
{0xfbe2,0xfbe3,0x06c9,0x06c9,},
{0x06ca,0x06ca,0x06ca,0x06ca,},
{0xfbde,0xfbdf,0x06cb,0x06cb,},
{0xfbfc,0xfbfd,0xfbfe,0xfbff,},
{0x06cd,0x06cd,0x06cd,0x06cd,},
{0x06ce,0x06ce,0x06ce,0x06ce,},
{0x06cf,0x06cf,0x06cf,0x06cf,},
{0xfbe4,0xfbe5,0xfbe6,0xfbe7,},
{0x06d1,0x06d1,0x06d1,0x06d1,},
{0xfbae,0xfbaf,0x06d2,0x06d2,},
{0xfbb0,0xfbb1,0x06d3,0x06d3,},
};
/* *INDENT-ON* */
#ifndef FRIBIDI_ACCESS_SHAPE_TABLE
# define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) \
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
#endif
#define FRIBIDI_GET_ARABIC_SHAPE_PRES(x,shape) FRIBIDI_ACCESS_SHAPE_TABLE(ArShap, 0x0621, 0x06d3, (x), (shape))
/* End of generated arabic-shaping.tab.i */
File diff suppressed because it is too large Load Diff
+61
View File
@@ -0,0 +1,61 @@
/* FriBidi
* bidi-types.h - define internal bidi types
*
* $Id: bidi-types.h,v 1.7 2006/01/31 03:23:12 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:12 $
* $Revision: 1.7 $
* $Source: /cvs/fribidi/fribidi2/lib/bidi-types.h,v $
*
* Author:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _BIDI_TYPES_H
#define _BIDI_TYPES_H
#include "common.h"
#include <fribidi-types.h>
#include <fribidi-bidi-types.h>
#include <fribidi-begindecls.h>
#define FRIBIDI_LEVEL_INVALID FRIBIDI_BIDI_MAX_RESOLVED_LEVELS
#define FRIBIDI_SENTINEL -1
#if DEBUG+0
#define fribidi_char_from_bidi_type FRIBIDI_PRIVATESPACE(char_from_bidi_type)
char
fribidi_char_from_bidi_type (
FriBidiCharType t /* input bidi type */
) FRIBIDI_GNUC_HIDDEN;
#endif /* DEBUG */
#include <fribidi-enddecls.h>
#endif /* !_BIDI_TYPES_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+190
View File
@@ -0,0 +1,190 @@
/* FriBidi
* common.h - common include for library sources
*
* $Id: common.h,v 1.20 2008-04-08 21:38:23 behdad Exp $
* $Author: behdad $
* $Date: 2008-04-08 21:38:23 $
* $Revision: 1.20 $
* $Source: /cvs/fribidi/fribidi2/lib/common.h,v $
*
* Author:
* Behdad Esfahbod, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _COMMON_H
#define _COMMON_H
#if HAVE_CONFIG_H+0
# include <config.h>
#endif
#include <fribidi-common.h>
/* FRIBIDI_PRIVATESPACE is a macro used to name library internal symbols. */
#ifndef FRIBIDI_PRIVATESPACE
# define FRIBIDI_PRIVATESPACE1(A,B) A##B
# define FRIBIDI_PRIVATESPACE0(A,B) FRIBIDI_PRIVATESPACE1(A,B)
# define FRIBIDI_PRIVATESPACE(SYMBOL) FRIBIDI_PRIVATESPACE0(_,FRIBIDI_NAMESPACE(_##SYMBOL##__internal__))
#endif /* !FRIBIDI_PRIVATESPACE */
#if (defined(WIN32)) || (defined(_WIN32_WCE))
# define FRIBIDI_ENTRY __declspec(dllexport)
#endif /* WIN32 */
#if FRIBIDI_USE_GLIB+0
# ifndef SIZEOF_LONG
# define SIZEOF_LONG GLIB_SIZEOF_LONG
# endif /* !SIZEOF_LONG */
# ifndef SIZEOF_VOID_P
# define SIZEOF_VOID_P GLIB_SIZEOF_VOID_P
# endif /* !SIZEOF_VOID_P */
# ifndef __FRIBIDI_DOC
# include <glib/gmem.h>
# endif /* !__FRIBIDI_DOC */
# ifndef fribidi_malloc
# define fribidi_malloc g_try_malloc
# define fribidi_free g_free
# endif /* !fribidi_malloc */
# ifndef fribidi_assert
# ifndef __FRIBIDI_DOC
# include <glib/gmessages.h>
# endif /* !__FRIBIDI_DOC */
# define fribidi_assert g_assert
# endif /* !fribidi_assert */
# ifndef __FRIBIDI_DOC
# include <glib/gmacros.h>
# endif /* !__FRIBIDI_DOC */
# ifndef FRIBIDI_BEGIN_STMT
# define FRIBIDI_BEGIN_STMT G_STMT_START {
# define FRIBIDI_END_STMT } G_STMT_END
# endif /* !FRIBIDI_BEGIN_STMT */
# ifndef LIKELY
# define LIKELY G_LIKELY
# define UNLIKELY G_UNLIKELY
# endif /* !LIKELY */
# ifndef false
# define false FALSE
# endif /* !false */
# ifndef true
# define true TRUE
# endif /* !true */
#endif /* FRIBIDI_USE_GLIB */
#ifndef false
# define false (0)
# endif /* !false */
# ifndef true
# define true (!false)
# endif /* !true */
#ifndef NULL
# ifdef __cplusplus
# define NULL (0L)
# else /* !__cplusplus */
# define NULL ((void*) 0)
# endif /* !__cplusplus */
#endif /* !NULL */
/* fribidi_malloc and fribidi_free should be used instead of malloc and free.
* No need to include any headers. */
#ifndef fribidi_malloc
# if HAVE_STDLIB_H
# ifndef __FRIBIDI_DOC
# include <stdlib.h>
# endif /* __FRIBIDI_DOC */
# define fribidi_malloc malloc
# else /* !HAVE_STDLIB_H */
# define fribidi_malloc (void *) malloc
# endif /* !HAVE_STDLIB_H */
# define fribidi_free free
#else /* fribidi_malloc */
# ifndef fribidi_free
# error You should define fribidi_free too when you define fribidi_malloc.
# endif /* !fribidi_free */
#endif /* fribidi_malloc */
#if HAVE_STRING_H+0
# if !STDC_HEADERS && HAVE_MEMORY_H
# include <memory.h>
# endif
# include <string.h>
#endif
#if HAVE_STRINGS_H+0
# include <strings.h>
#endif
/* FRIBIDI_CHUNK_SIZE is the number of bytes in each chunk of memory being
* allocated for data structure pools. */
#ifndef FRIBIDI_CHUNK_SIZE
# if HAVE_ASM_PAGE_H
# ifndef __FRIBIDI_DOC
# include <asm/page.h>
# endif /* __FRIBIDI_DOC */
# define FRIBIDI_CHUNK_SIZE (PAGE_SIZE - 16)
# else /* !HAVE_ASM_PAGE_H */
# define FRIBIDI_CHUNK_SIZE (4096 - 16)
# endif /* !HAVE_ASM_PAGE_H */
#else /* FRIBIDI_CHUNK_SIZE */
# if FRIBIDI_CHUNK_SIZE < 256
# error FRIBIDI_CHUNK_SIZE now should define the size of a chunk in bytes.
# endif /* FRIBIDI_CHUNK_SIZE < 256 */
#endif /* FRIBIDI_CHUNK_SIZE */
/* FRIBIDI_BEGIN_STMT should be used at the beginning of your macro
* definitions that are to behave like simple statements. Use
* FRIBIDI_END_STMT at the end of the macro after the semicolon or brace. */
#ifndef FRIBIDI_BEGIN_STMT
# define FRIBIDI_BEGIN_STMT do {
# define FRIBIDI_END_STMT } while (0)
#endif /* !FRIBIDI_BEGIN_STMT */
/* LIKEYLY and UNLIKELY are used to give a hint on branch prediction to the
* compiler. */
#ifndef LIKELY
# define LIKELY
# define UNLIKELY
#endif /* !LIKELY */
#ifndef FRIBIDI_EMPTY_STMT
# define FRIBIDI_EMPTY_STMT FRIBIDI_BEGIN_STMT (void) 0; FRIBIDI_END_STMT
#endif /* !FRIBIDI_EMPTY_STMT */
#if HAVE_STRINGIZE+0
# define STRINGIZE(symbol) #symbol
#else /* !HAVE_STRINGIZE */
# define STRINGIZE(symbol) (no stringize operator available)
#endif /* !HAVE_STRINGIZE */
/* As per recommendation of GNU Coding Standards. */
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif /* !_GNU_SOURCE */
/* We respect our own rules. */
#define FRIBIDI_NO_DEPRECATED
#include "debug.h"
#endif /* !_COMMON_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+113
View File
@@ -0,0 +1,113 @@
/* FriBidi
* debug.h - debug-only interfaces
*
* $Id: debug.h,v 1.10 2006/01/31 03:23:12 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:12 $
* $Revision: 1.10 $
* $Source: /cvs/fribidi/fribidi2/lib/debug.h,v $
*
* Author:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _DEBUG_H
#define _DEBUG_H
#include "common.h"
#include <fribidi-types.h>
#include <fribidi-begindecls.h>
#if DEBUG+0
/* These definitions should only be used in DEBUG mode: */
#ifndef __LINE__
# define __LINE__ 0
#endif /* !__LINE__ */
#ifndef __FILE__
# define __FILE__ "unknown"
#endif /* !__FILE__ */
#ifndef FRIBIDI_FPRINTF
# ifndef __FRIBIDI_DOC
# include <stdio.h>
# endif /* !__FRIBIDI_DOC */
# define FRIBIDI_FPRINTF fprintf
# define FRIBIDI_STDERR_ stderr,
#endif /* !FRIBIDI_FPRINTF */
#ifndef MSG
#define MSG(s) \
FRIBIDI_BEGIN_STMT \
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s); \
FRIBIDI_END_STMT
#define MSG2(s, t) \
FRIBIDI_BEGIN_STMT \
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t); \
FRIBIDI_END_STMT
#define MSG5(s, t, u, v, w) \
FRIBIDI_BEGIN_STMT \
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t, u, v, w); \
FRIBIDI_END_STMT
#endif /* !MSG */
#ifndef DBG
# define DBG(s) \
FRIBIDI_BEGIN_STMT \
if (fribidi_debug_status()) { MSG(FRIBIDI ": " s "\n"); } \
FRIBIDI_END_STMT
# define DBG2(s, t) \
FRIBIDI_BEGIN_STMT \
if (fribidi_debug_status()) { MSG2(FRIBIDI ": " s "\n", t); } \
FRIBIDI_END_STMT
#endif /* !DBG */
#ifndef fribidi_assert
# define fribidi_assert(cond) \
FRIBIDI_BEGIN_STMT \
if (!(cond)) { \
DBG(__FILE__ ":" STRINGIZE(__LINE__) ": " \
"assertion failed (" STRINGIZE(cond) ")"); \
} \
FRIBIDI_END_STMT
#endif /* !fribidi_assert */
#else /* !DEBUG */
#ifndef DBG
# define DBG(s) FRIBIDI_EMPTY_STMT
# define DBG2(s, t) FRIBIDI_EMPTY_STMT
#endif /* !DBG */
#ifndef fribidi_assert
# define fribidi_assert(cond) FRIBIDI_EMPTY_STMT
#endif /* !fribidi_assert */
#endif /* !DEBUG */
#include <fribidi-enddecls.h>
#endif /* !_DEBUG_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+193
View File
@@ -0,0 +1,193 @@
/* fribidi-arabic.c - Arabic shaping
*
* Copyright (C) 2005 Behdad Esfahbod
*
* This file is part of GNU FriBidi.
*
* GNU FriBidi is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* GNU FriBidi is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with GNU FriBidi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For licensing issues, contact <license@farsiweb.info> or write to
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
*/
/* $Id: fribidi-arabic.c,v 1.3 2007/04/05 16:14:39 behdad Exp $
* $Author: behdad $
* $Date: 2007/04/05 16:14:39 $
* $Revision: 1.3 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-arabic.c,v $
*
* Author(s):
* Behdad Esfahbod, 2005
*/
#include "common.h"
#if HAVE_STDLIB_H+0
# include <stdlib.h>
#endif
#include <fribidi-arabic.h>
#include <fribidi-unicode.h>
typedef struct _PairMap {
FriBidiChar pair[2], to;
} PairMap;
#define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) (table), (min), (max)
# define FRIBIDI_ACCESS_SHAPE_TABLE_REAL(table,min,max,x,shape) \
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
#include "arabic-shaping.tab.i"
#include "arabic-misc.tab.i"
static void
fribidi_shape_arabic_joining (
/* input */
const FriBidiChar table[][4],
FriBidiChar min,
FriBidiChar max,
const FriBidiStrIndex len,
const FriBidiArabicProp *ar_props,
/* input and output */
FriBidiChar *str
)
{
register FriBidiStrIndex i;
for (i = 0; i < len; i++)
if (FRIBIDI_ARAB_SHAPES(ar_props[i]))
str[i] = FRIBIDI_ACCESS_SHAPE_TABLE_REAL (table, min, max, str[i], FRIBIDI_JOIN_SHAPE (ar_props[i]));
}
static int
comp_PairMap (const void *pa, const void *pb)
{
PairMap *a = (PairMap *)pa;
PairMap *b = (PairMap *)pb;
if (a->pair[0] != b->pair[0])
return a->pair[0] < b->pair[0] ? -1 : +1;
else
return a->pair[1] < b->pair[1] ? -1 :
a->pair[1] > b->pair[1] ? +1 :
0;
}
static FriBidiChar
find_pair_match (const PairMap *table, int size, FriBidiChar first, FriBidiChar second)
{
PairMap *match;
PairMap x;
x.pair[0] = first;
x.pair[1] = second;
x.to = 0;
match = bsearch (&x, table, size, sizeof (table[0]), comp_PairMap);
return match ? match->to : 0;
}
#define PAIR_MATCH(table,len,first,second) \
((first)<(table[0].pair[0])||(first)>(table[len-1].pair[0])?0: \
find_pair_match(table, len, first, second))
static void
fribidi_shape_arabic_ligature (
/* input */
const PairMap *table,
int size,
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len,
/* input and output */
FriBidiArabicProp *ar_props,
FriBidiChar *str
)
{
/* TODO: This doesn't form ligatures for even-level Arabic text.
* no big problem though. */
register FriBidiStrIndex i;
for (i = 0; i < len - 1; i++) {
register FriBidiChar c;
if (FRIBIDI_LEVEL_IS_RTL(embedding_levels[i]) &&
embedding_levels[i] == embedding_levels[i+1] &&
(c = PAIR_MATCH(table, size, str[i], str[i+1])))
{
str[i] = FRIBIDI_CHAR_FILL;
FRIBIDI_SET_BITS(ar_props[i], FRIBIDI_MASK_LIGATURED);
str[i+1] = c;
}
}
}
#define DO_LIGATURING(table, levels, len, ar_props, str) \
fribidi_shape_arabic_ligature ((table), sizeof(table)/sizeof((table)[0]), levels, len, ar_props, str)
#define DO_SHAPING(tablemacro, len, ar_props, str) \
fribidi_shape_arabic_joining (tablemacro(,), len, ar_props, str);
FRIBIDI_ENTRY void
fribidi_shape_arabic (
/* input */
FriBidiFlags flags,
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len,
/* input and output */
FriBidiArabicProp *ar_props,
FriBidiChar *str
)
{
DBG ("in fribidi_shape_arabic");
if UNLIKELY
(len == 0 || !str) return;
DBG ("in fribidi_shape");
fribidi_assert (ar_props);
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_PRES))
{
DO_SHAPING (FRIBIDI_GET_ARABIC_SHAPE_PRES, len, ar_props, str);
}
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_LIGA))
{
DO_LIGATURING (mandatory_liga_table, embedding_levels, len, ar_props, str);
}
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE))
{
DO_LIGATURING (console_liga_table, embedding_levels, len, ar_props, str);
DO_SHAPING (FRIBIDI_GET_ARABIC_SHAPE_NSM, len, ar_props, str);
}
}
/* Editor directions:
* Local Variables:
* mode: c
* c-basic-offset: 2
* indent-tabs-mode: t
* tab-width: 8
* End:
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
*/
+88
View File
@@ -0,0 +1,88 @@
/* fribidi-arabic.h - do Arabic shaping to presentation forms
*
* Copyright (C) 2005 Behdad Esfahbod
*
* This file is part of GNU FriBidi.
*
* GNU FriBidi is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* GNU FriBidi is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with GNU FriBidi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For licensing issues, contact <license@farsiweb.info> or write to
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
*/
/* $Id: fribidi-arabic.h,v 1.1 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.1 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-arabic.h,v $
*
* Author(s):
* Behdad Esfahbod, 2005
*/
#ifndef _FRIBIDI_ARABIC_H
#define _FRIBIDI_ARABIC_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-flags.h"
#include "fribidi-bidi-types.h"
#include "fribidi-joining.h"
#include "fribidi-begindecls.h"
#define fribidi_shape_arabic FRIBIDI_NAMESPACE(shape_arabic)
/* fribidi_shape_arabic - do Arabic shaping
*
* The actual shaping that is done depends on the flags set. Only flags
* starting with FRIBIDI_FLAG_SHAPE_ARAB_ affect this function.
* Currently these are:
*
* * FRIBIDI_FLAG_SHAPE_MIRRORING: Do mirroring.
* * FRIBIDI_FLAG_SHAPE_ARAB_PRES: Shape Arabic characters to their
* presentation form glyphs.
* * FRIBIDI_FLAG_SHAPE_ARAB_LIGA: Form mandatory Arabic ligatures.
* * FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE: Perform additional Arabic shaping
* suitable for text rendered on
* grid terminals with no mark
* rendering capabilities.
*
* Of the above, FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE is only used in special
* cases, but the rest are recommended in any enviroment that doesn't have
* other means for doing Arabic shaping. The set of extra flags that enable
* this level of Arabic support has a shortcut named FRIBIDI_FLAGS_ARABIC.
*/
FRIBIDI_ENTRY void
fribidi_shape_arabic (
FriBidiFlags flags, /* shaping flags */
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len, /* input string length */
FriBidiArabicProp *ar_props, /* input/output Arabic properties as
* computed by fribidi_join_arabic */
FriBidiChar *str /* string to shape */
);
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_ARABIC_H */
/* Editor directions:
* Local Variables:
* mode: c
* c-basic-offset: 2
* indent-tabs-mode: t
* tab-width: 8
* End:
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
*/
@@ -0,0 +1,3 @@
#ifdef FRIBIDI_BEGIN_DECLS
FRIBIDI_BEGIN_DECLS
#endif /* FRIBIDI_BEGIN_DECLS */
@@ -0,0 +1,98 @@
#ifndef __FRIBIDI_DOC
/* FriBidi
* fribidi-bidi-types-list.h - list of bidi types
*
* $Id: fribidi-bidi-types-list.h,v 1.5 2004/06/13 20:11:42 behdad Exp $
* $Author: behdad $
* $Date: 2004/06/13 20:11:42 $
* $Revision: 1.5 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types-list.h,v $
*
* Author:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
/* *INDENT-OFF* */
#endif /* !__FRIBIDI_DOC */
#ifndef _FRIBIDI_ADD_TYPE
# define _FRIBIDI_ADD_TYPE(x,y)
#endif
#ifndef _FRIBIDI_ADD_ALIAS
# define _FRIBIDI_ADD_ALIAS(x1,x2)
#endif
#if !defined(_FRIBIDI_PAR_TYPES) || defined(_FRIBIDI_ALL_TYPES)
_FRIBIDI_ADD_TYPE (LTR, 'L') /* Left-To-Right letter */
_FRIBIDI_ADD_TYPE (RTL, 'R') /* Right-To-Left letter */
_FRIBIDI_ADD_TYPE (AL, 'A') /* Arabic Letter */
_FRIBIDI_ADD_TYPE (EN, '1') /* European Numeral */
_FRIBIDI_ADD_TYPE (AN, '9') /* Arabic Numeral */
_FRIBIDI_ADD_TYPE (ES, 'w') /* European number Separator */
_FRIBIDI_ADD_TYPE (ET, 'w') /* European number Terminator */
_FRIBIDI_ADD_TYPE (CS, 'w') /* Common Separator */
_FRIBIDI_ADD_TYPE (NSM, '`') /* Non Spacing Mark */
_FRIBIDI_ADD_TYPE (BN, 'b') /* Boundary Neutral */
_FRIBIDI_ADD_TYPE (BS, 'B') /* Block Separator */
_FRIBIDI_ADD_TYPE (SS, 'S') /* Segment Separator */
_FRIBIDI_ADD_TYPE (WS, '_') /* WhiteSpace */
_FRIBIDI_ADD_TYPE (ON, 'n') /* Other Neutral */
_FRIBIDI_ADD_TYPE (LRE, '+') /* Left-to-Right Embedding */
_FRIBIDI_ADD_TYPE (RLE, '+') /* Right-to-Left Embedding */
_FRIBIDI_ADD_TYPE (LRO, '+') /* Left-to-Right Override */
_FRIBIDI_ADD_TYPE (RLO, '+') /* Right-to-Left Override */
_FRIBIDI_ADD_TYPE (PDF, '-') /* Pop Directional Flag */
#if defined(_FRIBIDI_ADD_ALIAS)
_FRIBIDI_ADD_ALIAS (L, LTR)
_FRIBIDI_ADD_ALIAS (R, RTL)
_FRIBIDI_ADD_ALIAS (B, BS)
_FRIBIDI_ADD_ALIAS (S, SS)
#endif /* _FRIBIDI_ADD_ALIAS */
#if defined(_FRIBIDI_SENTINEL_TYPE) || defined(_FRIBIDI_ALL_TYPES)
_FRIBIDI_ADD_TYPE (SENTINEL, '$') /* SENTINEL */
#endif /* _FRIBIDI_SENTINEL_TYPES || _FRIBIDI_ALL_TYPES*/
#endif /* !_FRIBIDI_PAR_TYPES || _FRIBIDI_ALL_TYPES */
#if defined(_FRIBIDI_PAR_TYPES) || defined(_FRIBIDI_ALL_TYPES)
# if !defined(_FRIBIDI_ALL_TYPES)
_FRIBIDI_ADD_TYPE (LTR, 'L') /* Left-To-Right paragraph */
_FRIBIDI_ADD_TYPE (RTL, 'R') /* Right-To-Left paragraph */
_FRIBIDI_ADD_TYPE (ON, 'n') /* directiOn-Neutral paragraph */
# endif /* !_FRIBIDI_ALL_TYPES */
_FRIBIDI_ADD_TYPE (WLTR, 'l') /* Weak Left To Right paragraph */
_FRIBIDI_ADD_TYPE (WRTL, 'r') /* Weak Right To Left paragraph */
#endif /* _FRIBIDI_PAR_TYPES || _FRIBIDI_ALL_TYPES*/
#if defined(_FRIBIDI_ENUM_TYPES)
typedef enum {
# define _FRIBIDI_ADD_TYPE _FRIBIDI_ENUM_ADD_TYPE
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ADD_TYPE
_FRIBIDI_TYPES_MAX
} _FRIBIDI_ENUM_TYPES
#endif /* _FRIBIDI_ENUM_TYPES */
#ifndef __FRIBIDI_DOC
/* *INDENT-ON* */
#endif /* !__FRIBIDI_DOC */
+125
View File
@@ -0,0 +1,125 @@
/* FriBidi
* fribidi-bidi-types.c - character bidi types
*
* $Id: fribidi-bidi-types.c,v 1.9 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.9 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-bidi-types.h>
#include "bidi-types.h"
enum FriBidiCharTypeLinearEnum
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) TYPE,
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ADD_TYPE
_FRIBIDI_NUM_TYPES
};
#include "bidi-type.tab.i"
/* Map FriBidiCharTypeLinearEnum to FriBidiCharType. */
static const FriBidiCharType linear_enum_to_char_type[] = {
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_TYPE_##TYPE,
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ADD_TYPE
};
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_bidi_type (
/* input */
FriBidiChar ch
)
{
return linear_enum_to_char_type[FRIBIDI_GET_BIDI_TYPE (ch)];
}
FRIBIDI_ENTRY void
fribidi_get_bidi_types (
/* input */
const FriBidiChar *str,
const FriBidiStrIndex len,
/* output */
FriBidiCharType *btypes
)
{
register FriBidiStrIndex i = len;
for (; i; i--)
{
*btypes++ = linear_enum_to_char_type[FRIBIDI_GET_BIDI_TYPE (*str)];
str++;
}
}
FRIBIDI_ENTRY const char *
fribidi_get_bidi_type_name (
/* input */
FriBidiCharType t
)
{
switch (t)
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return STRINGIZE(TYPE);
# define _FRIBIDI_ALL_TYPES
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ALL_TYPES
# undef _FRIBIDI_ADD_TYPE
default:
return "?";
}
}
#if DEBUG+0
char
fribidi_char_from_bidi_type (
/* input */
FriBidiCharType t
)
{
switch (t)
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return SYMBOL;
# define _FRIBIDI_ALL_TYPES
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ALL_TYPES
# undef _FRIBIDI_ADD_TYPE
default:
return '?';
}
}
#endif /* DEBUG */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+389
View File
@@ -0,0 +1,389 @@
/* FriBidi
* fribidi-bidi-types.h - character bidi types
*
* $Id: fribidi-bidi-types.h,v 1.15 2008-11-24 17:48:31 behdad Exp $
* $Author: behdad $
* $Date: 2008-11-24 17:48:31 $
* $Revision: 1.15 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types.h,v $
*
* Author:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_BIDI_TYPES_H
#define _FRIBIDI_BIDI_TYPES_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-begindecls.h"
typedef signed char FriBidiLevel;
/*
* Define bit masks that bidi types are based on, each mask has
* only one bit set.
*/
/* RTL mask better be the least significant bit. */
#define FRIBIDI_MASK_RTL 0x00000001L /* Is right to left */
#define FRIBIDI_MASK_ARABIC 0x00000002L /* Is arabic */
/* Each char can be only one of the three following. */
#define FRIBIDI_MASK_STRONG 0x00000010L /* Is strong */
#define FRIBIDI_MASK_WEAK 0x00000020L /* Is weak */
#define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */
#define FRIBIDI_MASK_SENTINEL 0x00000080L /* Is sentinel */
/* Sentinels are not valid chars, just identify the start/end of strings. */
/* Each char can be only one of the five following. */
#define FRIBIDI_MASK_LETTER 0x00000100L /* Is letter: L, R, AL */
#define FRIBIDI_MASK_NUMBER 0x00000200L /* Is number: EN, AN */
#define FRIBIDI_MASK_NUMSEPTER 0x00000400L /* Is separator or terminator: ES, ET, CS */
#define FRIBIDI_MASK_SPACE 0x00000800L /* Is space: BN, BS, SS, WS */
#define FRIBIDI_MASK_EXPLICIT 0x00001000L /* Is expilict mark: LRE, RLE, LRO, RLO, PDF */
/* Can be set only if FRIBIDI_MASK_SPACE is also set. */
#define FRIBIDI_MASK_SEPARATOR 0x00002000L /* Is text separator: BS, SS */
/* Can be set only if FRIBIDI_MASK_EXPLICIT is also set. */
#define FRIBIDI_MASK_OVERRIDE 0x00004000L /* Is explicit override: LRO, RLO */
/* The following exist to make types pairwise different, some of them can
* be removed but are here because of efficiency (make queries faster). */
#define FRIBIDI_MASK_ES 0x00010000L
#define FRIBIDI_MASK_ET 0x00020000L
#define FRIBIDI_MASK_CS 0x00040000L
#define FRIBIDI_MASK_NSM 0x00080000L
#define FRIBIDI_MASK_BN 0x00100000L
#define FRIBIDI_MASK_BS 0x00200000L
#define FRIBIDI_MASK_SS 0x00400000L
#define FRIBIDI_MASK_WS 0x00800000L
/* We reserve a single bit for user's private use: we will never use it. */
#define FRIBIDI_MASK_PRIVATE 0x01000000L
/*
* Define values for FriBidiCharType
*/
/* Strong types */
/* Left-To-Right letter */
#define FRIBIDI_TYPE_LTR_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER )
/* Right-To-Left letter */
#define FRIBIDI_TYPE_RTL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \
| FRIBIDI_MASK_RTL)
/* Arabic Letter */
#define FRIBIDI_TYPE_AL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \
| FRIBIDI_MASK_RTL | FRIBIDI_MASK_ARABIC )
/* Left-to-Right Embedding */
#define FRIBIDI_TYPE_LRE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT)
/* Right-to-Left Embedding */
#define FRIBIDI_TYPE_RLE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
| FRIBIDI_MASK_RTL )
/* Left-to-Right Override */
#define FRIBIDI_TYPE_LRO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
| FRIBIDI_MASK_OVERRIDE )
/* Right-to-Left Override */
#define FRIBIDI_TYPE_RLO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
| FRIBIDI_MASK_RTL | FRIBIDI_MASK_OVERRIDE )
/* Weak types */
/* Pop Directional Flag*/
#define FRIBIDI_TYPE_PDF_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_EXPLICIT )
/* European Numeral */
#define FRIBIDI_TYPE_EN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER )
/* Arabic Numeral */
#define FRIBIDI_TYPE_AN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER \
| FRIBIDI_MASK_ARABIC )
/* European number Separator */
#define FRIBIDI_TYPE_ES_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
| FRIBIDI_MASK_ES )
/* European number Terminator */
#define FRIBIDI_TYPE_ET_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
| FRIBIDI_MASK_ET )
/* Common Separator */
#define FRIBIDI_TYPE_CS_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
| FRIBIDI_MASK_CS )
/* Non Spacing Mark */
#define FRIBIDI_TYPE_NSM_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NSM )
/* Boundary Neutral */
#define FRIBIDI_TYPE_BN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_SPACE \
| FRIBIDI_MASK_BN )
/* Neutral types */
/* Block Separator */
#define FRIBIDI_TYPE_BS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
| FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_BS )
/* Segment Separator */
#define FRIBIDI_TYPE_SS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
| FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_SS )
/* WhiteSpace */
#define FRIBIDI_TYPE_WS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
| FRIBIDI_MASK_WS )
/* Other Neutral */
#define FRIBIDI_TYPE_ON_VAL ( FRIBIDI_MASK_NEUTRAL )
/* The following are used in specifying paragraph direction only. */
/* Weak Left-To-Right */
#define FRIBIDI_TYPE_WLTR_VAL ( FRIBIDI_MASK_WEAK )
/* Weak Right-To-Left */
#define FRIBIDI_TYPE_WRTL_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_RTL )
/* start or end of text (run list) SENTINEL. Only used internally */
#define FRIBIDI_TYPE_SENTINEL ( FRIBIDI_MASK_SENTINEL )
/* Private types for applications. More private types can be obtained by
* summing up from this one. */
#define FRIBIDI_TYPE_PRIVATE ( FRIBIDI_MASK_PRIVATE )
/* Define Enums only if sizeof(int) == 4 (UTF-32), and not compiling C++.
* The problem with C++ is that then casts between int32 and enum will fail!
*/
#if defined(__FRIBIDI_DOC) || (FRIBIDI_SIZEOF_INT+0 == 4 && !defined(__cplusplus))
typedef enum
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
FRIBIDI_TYPE_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL,
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ADD_TYPE
_FRIBIDI_TYPE_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */
} FriBidiCharType;
typedef enum
{
# define _FRIBIDI_PAR_TYPES
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
FRIBIDI_PAR_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL,
# include "fribidi-bidi-types-list.h"
# undef _FRIBIDI_ADD_TYPE
# undef _FRIBIDI_PAR_TYPES
_FRIBIDI_PAR_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */
} FriBidiParType;
#else
typedef fribidi_uint32 FriBidiCharType;
# define FRIBIDI_TYPE_LTR FRIBIDI_TYPE_LTR_VAL
# define FRIBIDI_TYPE_RTL FRIBIDI_TYPE_RTL_VAL
# define FRIBIDI_TYPE_AL FRIBIDI_TYPE_AL_VAL
# define FRIBIDI_TYPE_EN FRIBIDI_TYPE_EN_VAL
# define FRIBIDI_TYPE_AN FRIBIDI_TYPE_AN_VAL
# define FRIBIDI_TYPE_ES FRIBIDI_TYPE_ES_VAL
# define FRIBIDI_TYPE_ET FRIBIDI_TYPE_ET_VAL
# define FRIBIDI_TYPE_CS FRIBIDI_TYPE_CS_VAL
# define FRIBIDI_TYPE_NSM FRIBIDI_TYPE_NSM_VAL
# define FRIBIDI_TYPE_BN FRIBIDI_TYPE_BN_VAL
# define FRIBIDI_TYPE_BS FRIBIDI_TYPE_BS_VAL
# define FRIBIDI_TYPE_SS FRIBIDI_TYPE_SS_VAL
# define FRIBIDI_TYPE_WS FRIBIDI_TYPE_WS_VAL
# define FRIBIDI_TYPE_ON FRIBIDI_TYPE_ON_VAL
# define FRIBIDI_TYPE_LRE FRIBIDI_TYPE_LRE_VAL
# define FRIBIDI_TYPE_RLE FRIBIDI_TYPE_RLE_VAL
# define FRIBIDI_TYPE_LRO FRIBIDI_TYPE_LRO_VAL
# define FRIBIDI_TYPE_RLO FRIBIDI_TYPE_RLO_VAL
# define FRIBIDI_TYPE_PDF FRIBIDI_TYPE_PDF_VAL
typedef fribidi_uint32 FriBidiParType;
# define FRIBIDI_PAR_LTR FRIBIDI_TYPE_LTR_VAL
# define FRIBIDI_PAR_RTL FRIBIDI_TYPE_RTL_VAL
# define FRIBIDI_PAR_ON FRIBIDI_TYPE_ON_VAL
# define FRIBIDI_PAR_WLTR FRIBIDI_TYPE_WLTR_VAL
# define FRIBIDI_PAR_WRTL FRIBIDI_TYPE_WRTL_VAL
#endif
/* Please don't use these two type names, use FRIBIDI_PAR_* form instead. */
#define FRIBIDI_TYPE_WLTR FRIBIDI_PAR_WLTR
#define FRIBIDI_TYPE_WRTL FRIBIDI_PAR_WRTL
/*
* Defining macros for needed queries, It is fully dependent on the
* implementation of FriBidiCharType.
*/
/* Is right-to-left level? */
#define FRIBIDI_LEVEL_IS_RTL(lev) ((lev) & 1)
/* Return the bidi type corresponding to the direction of the level number,
FRIBIDI_TYPE_LTR for evens and FRIBIDI_TYPE_RTL for odds. */
#define FRIBIDI_LEVEL_TO_DIR(lev) \
(FRIBIDI_LEVEL_IS_RTL (lev) ? FRIBIDI_TYPE_RTL : FRIBIDI_TYPE_LTR)
/* Return the minimum level of the direction, 0 for FRIBIDI_TYPE_LTR and
1 for FRIBIDI_TYPE_RTL and FRIBIDI_TYPE_AL. */
#define FRIBIDI_DIR_TO_LEVEL(dir) \
((FriBidiLevel) (FRIBIDI_IS_RTL (dir) ? 1 : 0))
/* Is right to left: RTL, AL, RLE, RLO? */
#define FRIBIDI_IS_RTL(p) ((p) & FRIBIDI_MASK_RTL)
/* Is arabic: AL, AN? */
#define FRIBIDI_IS_ARABIC(p) ((p) & FRIBIDI_MASK_ARABIC)
/* Is strong? */
#define FRIBIDI_IS_STRONG(p) ((p) & FRIBIDI_MASK_STRONG)
/* Is weak? */
#define FRIBIDI_IS_WEAK(p) ((p) & FRIBIDI_MASK_WEAK)
/* Is neutral? */
#define FRIBIDI_IS_NEUTRAL(p) ((p) & FRIBIDI_MASK_NEUTRAL)
/* Is sentinel? */
#define FRIBIDI_IS_SENTINEL(p) ((p) & FRIBIDI_MASK_SENTINEL)
/* Is letter: L, R, AL? */
#define FRIBIDI_IS_LETTER(p) ((p) & FRIBIDI_MASK_LETTER)
/* Is number: EN, AN? */
#define FRIBIDI_IS_NUMBER(p) ((p) & FRIBIDI_MASK_NUMBER)
/* Is number separator or terminator: ES, ET, CS? */
#define FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR(p) \
((p) & FRIBIDI_MASK_NUMSEPTER)
/* Is space: BN, BS, SS, WS? */
#define FRIBIDI_IS_SPACE(p) ((p) & FRIBIDI_MASK_SPACE)
/* Is explicit mark: LRE, RLE, LRO, RLO, PDF? */
#define FRIBIDI_IS_EXPLICIT(p) ((p) & FRIBIDI_MASK_EXPLICIT)
/* Is text separator: BS, SS? */
#define FRIBIDI_IS_SEPARATOR(p) ((p) & FRIBIDI_MASK_SEPARATOR)
/* Is explicit override: LRO, RLO? */
#define FRIBIDI_IS_OVERRIDE(p) ((p) & FRIBIDI_MASK_OVERRIDE)
/* Some more: */
/* Is left to right letter: LTR? */
#define FRIBIDI_IS_LTR_LETTER(p) \
((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) == FRIBIDI_MASK_LETTER)
/* Is right to left letter: RTL, AL? */
#define FRIBIDI_IS_RTL_LETTER(p) \
((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) \
== (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL))
/* Is ES or CS: ES, CS? */
#define FRIBIDI_IS_ES_OR_CS(p) \
((p) & (FRIBIDI_MASK_ES | FRIBIDI_MASK_CS))
/* Is explicit or BN: LRE, RLE, LRO, RLO, PDF, BN? */
#define FRIBIDI_IS_EXPLICIT_OR_BN(p) \
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN))
/* Is explicit or BN or NSM: LRE, RLE, LRO, RLO, PDF, BN, NSM? */
#define FRIBIDI_IS_EXPLICIT_OR_BN_OR_NSM(p) \
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM))
/* Is explicit or BN or WS: LRE, RLE, LRO, RLO, PDF, BN, WS? */
#define FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS(p) \
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS))
/* Is explicit or separator or BN or WS: LRE, RLE, LRO, RLO, PDF, BS, SS, BN, WS? */
#define FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS(p) \
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_SEPARATOR \
| FRIBIDI_MASK_BN | FRIBIDI_MASK_WS))
/* Is private-use type for application? */
#define FRIBIDI_IS_PRIVATE(p) ((p) & FRIBIDI_MASK_PRIVATE)
/* Define some conversions. */
/* Change numbers to RTL: EN,AN -> RTL. */
#define FRIBIDI_CHANGE_NUMBER_TO_RTL(p) \
(FRIBIDI_IS_NUMBER(p) ? FRIBIDI_TYPE_RTL : (p))
/* Override status of an explicit mark:
* LRO,LRE->LTR, RLO,RLE->RTL, otherwise->ON. */
#define FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR(p) \
(FRIBIDI_IS_OVERRIDE(p) ? FRIBIDI_LEVEL_TO_DIR(FRIBIDI_DIR_TO_LEVEL(p)) \
: FRIBIDI_TYPE_ON)
/* Weaken type for paragraph fallback purposes:
* LTR->WLTR, RTL->WRTL. */
#define FRIBIDI_WEAK_PARAGRAPH(p) (FRIBIDI_PAR_WLTR | ((p) & FRIBIDI_MASK_RTL))
/* Functions finally */
#define fribidi_get_bidi_type FRIBIDI_NAMESPACE(get_bidi_type)
/* fribidi_get_bidi_type - get character bidi type
*
* This function returns the bidi type of a character as defined in Table 3.7
* Bidirectional Character Types of the Unicode Bidirectional Algorithm
* available at
* http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, using
* data provided in file UnicodeData.txt of the Unicode Character Database
* available at http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.
*
* There are a few macros defined in fribidi-bidi-types.h for querying a bidi
* type.
*/
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_bidi_type (
FriBidiChar ch /* input character */
) FRIBIDI_GNUC_CONST;
#define fribidi_get_bidi_types FRIBIDI_NAMESPACE(get_bidi_types)
/* fribidi_get_bidi_types - get bidi types for an string of characters
*
* This function finds the bidi types of an string of characters. See
* fribidi_get_bidi_type() for more information about the bidi types returned
* by this function.
*/
FRIBIDI_ENTRY void fribidi_get_bidi_types (
const FriBidiChar *str, /* input string */
const FriBidiStrIndex len, /* input string length */
FriBidiCharType *btypes /* output bidi types */
);
#define fribidi_get_bidi_type_name FRIBIDI_NAMESPACE(get_bidi_type_name)
/* fribidi_get_bidi_type_name - get bidi type name
*
* This function returns the bidi type name of a character type. The
* returned string is a static string and should not be freed.
*
* The type names are the same as ones defined in Table 3.7 Bidirectional
* Character Types of the Unicode Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, with a
* few modifications: L->LTR, R->RTL, B->BS, S->SS.
*/
FRIBIDI_ENTRY const char *fribidi_get_bidi_type_name (
FriBidiCharType t /* input bidi type */
) FRIBIDI_GNUC_CONST;
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_BIDI_TYPES_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+992
View File
@@ -0,0 +1,992 @@
/* FriBidi
* fribidi-bidi.c - bidirectional algorithm
*
* $Id: fribidi-bidi.c,v 1.21 2007/03/15 18:09:25 behdad Exp $
* $Author: behdad $
* $Date: 2007/03/15 18:09:25 $
* $Revision: 1.21 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001,2002 Behdad Esfahbod
* Copyright (C) 1999,2000 Dov Grobgeld
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-bidi.h>
#include <fribidi-mirroring.h>
#include <fribidi-unicode.h>
#include "mem.h"
#include "bidi-types.h"
#include "run.h"
/*
* This file implements most of Unicode Standard Annex #9, Tracking Number 13.
*/
#ifndef MAX
# define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif /* !MAX */
/* Some convenience macros */
#define RL_TYPE(list) ((list)->type)
#define RL_LEN(list) ((list)->len)
#define RL_POS(list) ((list)->pos)
#define RL_LEVEL(list) ((list)->level)
static FriBidiRun *
merge_with_prev (
FriBidiRun *second
)
{
FriBidiRun *first;
fribidi_assert (second);
fribidi_assert (second->next);
first = second->prev;
fribidi_assert (first);
first->next = second->next;
first->next->prev = first;
RL_LEN (first) += RL_LEN (second);
free_run (second);
return first;
}
static void
compact_list (
FriBidiRun *list
)
{
fribidi_assert (list);
if (list->next)
for_run_list (list, list)
if (RL_TYPE (list->prev) == RL_TYPE (list)
&& RL_LEVEL (list->prev) == RL_LEVEL (list))
list = merge_with_prev (list);
}
static void
compact_neutrals (
FriBidiRun *list
)
{
fribidi_assert (list);
if (list->next)
{
for_run_list (list, list)
{
if (RL_LEVEL (list->prev) == RL_LEVEL (list)
&&
((RL_TYPE
(list->prev) == RL_TYPE (list)
|| (FRIBIDI_IS_NEUTRAL (RL_TYPE (list->prev))
&& FRIBIDI_IS_NEUTRAL (RL_TYPE (list))))))
list = merge_with_prev (list);
}
}
}
#if DEBUG+0
/*======================================================================
* For debugging, define some functions for printing the types and the
* levels.
*----------------------------------------------------------------------*/
static char char_from_level_array[] = {
'$', /* -1 == FRIBIDI_SENTINEL, indicating
* start or end of string. */
/* 0-61 == 0-9,a-z,A-Z are the the only valid levels before resolving
* implicits. after that the level @ may be appear too. */
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z',
'@', /* 62 == only must appear after resolving
* implicits. */
'!', /* 63 == FRIBIDI_LEVEL_INVALID, internal error,
* this level shouldn't be seen. */
'*', '*', '*', '*', '*' /* >= 64 == overflows, this levels and higher
* levels show a real bug!. */
};
#define fribidi_char_from_level(level) char_from_level_array[(level) + 1]
static void
print_types_re (
const FriBidiRun *pp
)
{
fribidi_assert (pp);
MSG (" Run types : ");
for_run_list (pp, pp)
{
MSG5 ("%d:%d(%s)[%d] ",
pp->pos, pp->len, fribidi_get_bidi_type_name (pp->type), pp->level);
}
MSG ("\n");
}
static void
print_resolved_levels (
const FriBidiRun *pp
)
{
fribidi_assert (pp);
MSG (" Res. levels: ");
for_run_list (pp, pp)
{
register FriBidiStrIndex i;
for (i = RL_LEN (pp); i; i--)
MSG2 ("%c", fribidi_char_from_level (RL_LEVEL (pp)));
}
MSG ("\n");
}
static void
print_resolved_types (
const FriBidiRun *pp
)
{
fribidi_assert (pp);
MSG (" Res. types : ");
for_run_list (pp, pp)
{
FriBidiStrIndex i;
for (i = RL_LEN (pp); i; i--)
MSG2 ("%c", fribidi_char_from_bidi_type (pp->type));
}
MSG ("\n");
}
static void
print_bidi_string (
/* input */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len
)
{
register FriBidiStrIndex i;
fribidi_assert (bidi_types);
MSG (" Org. types : ");
for (i = 0; i < len; i++)
MSG2 ("%c", fribidi_char_from_bidi_type (bidi_types[i]));
MSG ("\n");
}
#endif /* DEBUG */
/*=========================================================================
* define macros for push and pop the status in to / out of the stack
*-------------------------------------------------------------------------*/
/* There are a few little points in pushing into and poping from the status
stack:
1. when the embedding level is not valid (more than
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61), you must reject it, and not to push
into the stack, but when you see a PDF, you must find the matching code,
and if it was pushed in the stack, pop it, it means you must pop if and
only if you have pushed the matching code, the over_pushed var counts the
number of rejected codes so far.
2. there's a more confusing point too, when the embedding level is exactly
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL-1=60, an LRO or LRE is rejected
because the new level would be FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL+1=62, that
is invalid; but an RLO or RLE is accepted because the new level is
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61, that is valid, so the rejected codes
may be not continuous in the logical order, in fact there are at most two
continuous intervals of codes, with an RLO or RLE between them. To support
this case, the first_interval var counts the number of rejected codes in
the first interval, when it is 0, means that there is only one interval.
*/
/* a. If this new level would be valid, then this embedding code is valid.
Remember (push) the current embedding level and override status.
Reset current level to this new level, and reset the override status to
new_override.
b. If the new level would not be valid, then this code is invalid. Don't
change the current level or override status.
*/
#define PUSH_STATUS \
FRIBIDI_BEGIN_STMT \
if LIKELY(new_level <= FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL) \
{ \
if UNLIKELY(level == FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL - 1) \
first_interval = over_pushed; \
status_stack[stack_size].level = level; \
status_stack[stack_size].override = override; \
stack_size++; \
level = new_level; \
override = new_override; \
} else \
over_pushed++; \
FRIBIDI_END_STMT
/* If there was a valid matching code, restore (pop) the last remembered
(pushed) embedding level and directional override.
*/
#define POP_STATUS \
FRIBIDI_BEGIN_STMT \
if (stack_size) \
{ \
if UNLIKELY(over_pushed > first_interval) \
over_pushed--; \
else \
{ \
if LIKELY(over_pushed == first_interval) \
first_interval = 0; \
stack_size--; \
level = status_stack[stack_size].level; \
override = status_stack[stack_size].override; \
} \
} \
FRIBIDI_END_STMT
/* Return the type of previous run or the SOR, if already at the start of
a level run. */
#define PREV_TYPE_OR_SOR(pp) \
( \
RL_LEVEL(pp->prev) == RL_LEVEL(pp) ? \
RL_TYPE(pp->prev) : \
FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->prev), RL_LEVEL(pp))) \
)
/* Return the type of next run or the EOR, if already at the end of
a level run. */
#define NEXT_TYPE_OR_EOR(pp) \
( \
RL_LEVEL(pp->next) == RL_LEVEL(pp) ? \
RL_TYPE(pp->next) : \
FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->next), RL_LEVEL(pp))) \
)
/* Return the embedding direction of a link. */
#define FRIBIDI_EMBEDDING_DIRECTION(link) \
FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(link))
FRIBIDI_ENTRY FriBidiParType
fribidi_get_par_direction (
/* input */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len
)
{
register FriBidiStrIndex i;
fribidi_assert (bidi_types);
for (i = 0; i < len; i++)
if (FRIBIDI_IS_LETTER (bidi_types[i]))
return FRIBIDI_IS_RTL (bidi_types[i]) ? FRIBIDI_PAR_RTL :
FRIBIDI_PAR_LTR;
return FRIBIDI_PAR_ON;
}
FRIBIDI_ENTRY FriBidiLevel
fribidi_get_par_embedding_levels (
/* input */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len,
/* input and output */
FriBidiParType *pbase_dir,
/* output */
FriBidiLevel *embedding_levels
)
{
FriBidiLevel base_level, max_level = 0;
FriBidiParType base_dir;
FriBidiRun *main_run_list = NULL, *explicits_list = NULL, *pp;
fribidi_boolean status = false;
if UNLIKELY
(!len)
{
status = true;
goto out;
}
DBG ("in fribidi_get_par_embedding_levels");
fribidi_assert (bidi_types);
fribidi_assert (pbase_dir);
fribidi_assert (embedding_levels);
/* Determinate character types */
{
/* Get run-length encoded character types */
main_run_list = run_list_encode_bidi_types (bidi_types, len);
if UNLIKELY
(!main_run_list) goto out;
}
/* Find base level */
/* If no strong base_dir was found, resort to the weak direction
that was passed on input. */
base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir);
if (!FRIBIDI_IS_STRONG (*pbase_dir))
/* P2. P3. Search for first strong character and use its direction as
base direction */
{
for_run_list (pp, main_run_list) if (FRIBIDI_IS_LETTER (RL_TYPE (pp)))
{
base_level = FRIBIDI_DIR_TO_LEVEL (RL_TYPE (pp));
*pbase_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
break;
}
}
base_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
DBG2 (" base level : %c", fribidi_char_from_level (base_level));
DBG2 (" base dir : %c", fribidi_char_from_bidi_type (base_dir));
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_types_re (main_run_list);
}
# endif /* DEBUG */
/* Explicit Levels and Directions */
DBG ("explicit levels and directions");
{
FriBidiLevel level, new_level;
FriBidiCharType override, new_override;
FriBidiStrIndex i;
int stack_size, over_pushed, first_interval;
struct
{
FriBidiCharType override; /* only LTR, RTL and ON are valid */
FriBidiLevel level;
} *status_stack;
FriBidiRun temp_link;
/* explicits_list is a list like main_run_list, that holds the explicit
codes that are removed from main_run_list, to reinsert them later by
calling the shadow_run_list.
*/
explicits_list = new_run_list ();
if UNLIKELY
(!explicits_list) goto out;
/* X1. Begin by setting the current embedding level to the paragraph
embedding level. Set the directional override status to neutral.
Process each character iteratively, applying rules X2 through X9.
Only embedding levels from 0 to 61 are valid in this phase. */
level = base_level;
override = FRIBIDI_TYPE_ON;
/* stack */
stack_size = 0;
over_pushed = 0;
first_interval = 0;
status_stack = fribidi_malloc (sizeof (status_stack[0]) *
FRIBIDI_BIDI_MAX_RESOLVED_LEVELS);
for_run_list (pp, main_run_list)
{
FriBidiCharType this_type = RL_TYPE (pp);
if (FRIBIDI_IS_EXPLICIT_OR_BN (this_type))
{
if (FRIBIDI_IS_STRONG (this_type))
{ /* LRE, RLE, LRO, RLO */
/* 1. Explicit Embeddings */
/* X2. With each RLE, compute the least greater odd
embedding level. */
/* X3. With each LRE, compute the least greater even
embedding level. */
/* 2. Explicit Overrides */
/* X4. With each RLO, compute the least greater odd
embedding level. */
/* X5. With each LRO, compute the least greater even
embedding level. */
new_override = FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR (this_type);
for (i = RL_LEN (pp); i; i--)
{
new_level =
((level + FRIBIDI_DIR_TO_LEVEL (this_type) + 2) & ~1) -
FRIBIDI_DIR_TO_LEVEL (this_type);
PUSH_STATUS;
}
}
else if (this_type == FRIBIDI_TYPE_PDF)
{
/* 3. Terminating Embeddings and overrides */
/* X7. With each PDF, determine the matching embedding or
override code. */
for (i = RL_LEN (pp); i; i--)
POP_STATUS;
}
/* X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. */
/* Remove element and add it to explicits_list */
RL_LEVEL (pp) = FRIBIDI_SENTINEL;
temp_link.next = pp->next;
move_node_before (pp, explicits_list);
pp = &temp_link;
}
else
{
/* X6. For all types besides RLE, LRE, RLO, LRO, and PDF:
a. Set the level of the current character to the current
embedding level.
b. Whenever the directional override status is not neutral,
reset the current character type to the directional override
status. */
RL_LEVEL (pp) = level;
if (!FRIBIDI_IS_NEUTRAL (override))
RL_TYPE (pp) = override;
}
/* X8. All explicit directional embeddings and overrides are
completely terminated at the end of each paragraph. Paragraph
separators are not included in the embedding. */
/* This function is running on a single paragraph, so we can do
X8 after all the input is processed. */
}
/* Implementing X8. It has no effect on a single paragraph! */
level = base_level;
override = FRIBIDI_TYPE_ON;
stack_size = 0;
over_pushed = 0;
fribidi_free (status_stack);
}
/* X10. The remaining rules are applied to each run of characters at the
same level. For each run, determine the start-of-level-run (sor) and
end-of-level-run (eor) type, either L or R. This depends on the
higher of the two levels on either side of the boundary (at the start
or end of the paragraph, the level of the 'other' run is the base
embedding level). If the higher level is odd, the type is R, otherwise
it is L. */
/* Resolving Implicit Levels can be done out of X10 loop, so only change
of Resolving Weak Types and Resolving Neutral Types is needed. */
compact_list (main_run_list);
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_types_re (main_run_list);
print_bidi_string (bidi_types, len);
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
/* 4. Resolving weak types */
DBG ("resolving weak types");
{
FriBidiCharType last_strong, prev_type_orig;
fribidi_boolean w4;
last_strong = base_dir;
for_run_list (pp, main_run_list)
{
register FriBidiCharType prev_type, this_type, next_type;
prev_type = PREV_TYPE_OR_SOR (pp);
this_type = RL_TYPE (pp);
next_type = NEXT_TYPE_OR_EOR (pp);
if (FRIBIDI_IS_STRONG (prev_type))
last_strong = prev_type;
/* W1. NSM
Examine each non-spacing mark (NSM) in the level run, and change the
type of the NSM to the type of the previous character. If the NSM
is at the start of the level run, it will get the type of sor. */
/* Implementation note: it is important that if the previous character
is not sor, then we should merge this run with the previous,
because of rules like W5, that we assume all of a sequence of
adjacent ETs are in one FriBidiRun. */
if (this_type == FRIBIDI_TYPE_NSM)
{
if (RL_LEVEL (pp->prev) == RL_LEVEL (pp))
pp = merge_with_prev (pp);
else
RL_TYPE (pp) = prev_type;
continue; /* As we know the next condition cannot be true. */
}
/* W2: European numbers. */
if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_AL)
{
RL_TYPE (pp) = FRIBIDI_TYPE_AN;
/* Resolving dependency of loops for rules W1 and W2, so we
can merge them in one loop. */
if (next_type == FRIBIDI_TYPE_NSM)
RL_TYPE (pp->next) = FRIBIDI_TYPE_AN;
}
}
last_strong = base_dir;
/* Resolving dependency of loops for rules W4 and W5, W5 may
want to prevent W4 to take effect in the next turn, do this
through "w4". */
w4 = true;
/* Resolving dependency of loops for rules W4 and W5 with W7,
W7 may change an EN to L but it sets the prev_type_orig if needed,
so W4 and W5 in next turn can still do their works. */
prev_type_orig = FRIBIDI_TYPE_ON;
for_run_list (pp, main_run_list)
{
register FriBidiCharType prev_type, this_type, next_type;
prev_type = PREV_TYPE_OR_SOR (pp);
this_type = RL_TYPE (pp);
next_type = NEXT_TYPE_OR_EOR (pp);
if (FRIBIDI_IS_STRONG (prev_type))
last_strong = prev_type;
/* W3: Change ALs to R. */
if (this_type == FRIBIDI_TYPE_AL)
{
RL_TYPE (pp) = FRIBIDI_TYPE_RTL;
w4 = true;
prev_type_orig = FRIBIDI_TYPE_ON;
continue;
}
/* W4. A single european separator changes to a european number.
A single common separator between two numbers of the same type
changes to that type. */
if (w4
&& RL_LEN (pp) == 1 && FRIBIDI_IS_ES_OR_CS (this_type)
&& FRIBIDI_IS_NUMBER (prev_type_orig)
&& prev_type_orig == next_type
&& (prev_type_orig == FRIBIDI_TYPE_EN
|| this_type == FRIBIDI_TYPE_CS))
{
RL_TYPE (pp) = prev_type;
this_type = RL_TYPE (pp);
}
w4 = true;
/* W5. A sequence of European terminators adjacent to European
numbers changes to All European numbers. */
if (this_type == FRIBIDI_TYPE_ET
&& (prev_type_orig == FRIBIDI_TYPE_EN
|| next_type == FRIBIDI_TYPE_EN))
{
RL_TYPE (pp) = FRIBIDI_TYPE_EN;
w4 = false;
this_type = RL_TYPE (pp);
}
/* W6. Otherwise change separators and terminators to other neutral. */
if (FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR (this_type))
RL_TYPE (pp) = FRIBIDI_TYPE_ON;
/* W7. Change european numbers to L. */
if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_LTR)
{
RL_TYPE (pp) = FRIBIDI_TYPE_LTR;
prev_type_orig = (RL_LEVEL (pp) == RL_LEVEL (pp->next) ?
FRIBIDI_TYPE_EN : FRIBIDI_TYPE_ON);
}
else
prev_type_orig = PREV_TYPE_OR_SOR (pp->next);
}
}
compact_neutrals (main_run_list);
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
/* 5. Resolving Neutral Types */
DBG ("resolving neutral types");
{
/* N1. and N2.
For each neutral, resolve it. */
for_run_list (pp, main_run_list)
{
FriBidiCharType prev_type, this_type, next_type;
/* "European and Arabic numbers are treated as though they were R"
FRIBIDI_CHANGE_NUMBER_TO_RTL does this. */
this_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (RL_TYPE (pp));
prev_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (PREV_TYPE_OR_SOR (pp));
next_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (NEXT_TYPE_OR_EOR (pp));
if (FRIBIDI_IS_NEUTRAL (this_type))
RL_TYPE (pp) = (prev_type == next_type) ?
/* N1. */ prev_type :
/* N2. */ FRIBIDI_EMBEDDING_DIRECTION (pp);
}
}
compact_list (main_run_list);
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
/* 6. Resolving implicit levels */
DBG ("resolving implicit levels");
{
max_level = base_level;
for_run_list (pp, main_run_list)
{
FriBidiCharType this_type;
int level;
this_type = RL_TYPE (pp);
level = RL_LEVEL (pp);
/* I1. Even */
/* I2. Odd */
if (FRIBIDI_IS_NUMBER (this_type))
RL_LEVEL (pp) = (level + 2) & ~1;
else
RL_LEVEL (pp) =
level +
(FRIBIDI_LEVEL_IS_RTL (level) ^ FRIBIDI_DIR_TO_LEVEL (this_type));
if (RL_LEVEL (pp) > max_level)
max_level = RL_LEVEL (pp);
}
}
compact_list (main_run_list);
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_bidi_string (bidi_types, len);
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
/* Reinsert the explicit codes & BN's that are already removed, from the
explicits_list to main_run_list. */
DBG ("reinserting explicit codes");
if UNLIKELY
(explicits_list->next != explicits_list)
{
register FriBidiRun *p;
register fribidi_boolean stat =
shadow_run_list (main_run_list, explicits_list, true);
explicits_list = NULL;
if UNLIKELY
(!stat) goto out;
/* Set level of inserted explicit chars to that of their previous
* char, such that they do not affect reordering. */
p = main_run_list->next;
if (p != main_run_list && p->level == FRIBIDI_SENTINEL)
p->level = base_level;
for_run_list (p, main_run_list) if (p->level == FRIBIDI_SENTINEL)
p->level = p->prev->level;
}
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_types_re (main_run_list);
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
DBG ("reset the embedding levels, 1, 2, 3.");
{
register int j, state, pos;
register FriBidiCharType char_type;
register FriBidiRun *p, *q, *list;
/* L1. Reset the embedding levels of some chars:
1. segment separators,
2. paragraph separators,
3. any sequence of whitespace characters preceding a segment
separator or paragraph separator, and
... (to be continued in fribidi_reorder_line()). */
list = new_run_list ();
if UNLIKELY
(!list) goto out;
q = list;
state = 1;
pos = len - 1;
for (j = len - 1; j >= -1; j--)
{
/* close up the open link at the end */
if (j >= 0)
char_type = bidi_types[j];
else
char_type = FRIBIDI_TYPE_ON;
if (!state && FRIBIDI_IS_SEPARATOR (char_type))
{
state = 1;
pos = j;
}
else if (state && !FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS
(char_type))
{
state = 0;
p = new_run ();
if UNLIKELY
(!p)
{
free_run_list (list);
goto out;
}
p->pos = j + 1;
p->len = pos - j;
p->type = base_dir;
p->level = base_level;
move_node_before (p, q);
q = p;
}
}
if UNLIKELY
(!shadow_run_list (main_run_list, list, false)) goto out;
}
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_types_re (main_run_list);
print_resolved_levels (main_run_list);
print_resolved_types (main_run_list);
}
# endif /* DEBUG */
{
FriBidiStrIndex pos = 0;
for_run_list (pp, main_run_list)
{
register FriBidiStrIndex l;
register FriBidiLevel level = pp->level;
for (l = pp->len; l; l--)
embedding_levels[pos++] = level;
}
}
status = true;
out:
DBG ("leaving fribidi_get_par_embedding_levels");
if (main_run_list)
free_run_list (main_run_list);
if UNLIKELY
(explicits_list) free_run_list (explicits_list);
return status ? max_level + 1 : 0;
}
static void
bidi_string_reverse (
FriBidiChar *str,
const FriBidiStrIndex len
)
{
FriBidiStrIndex i;
fribidi_assert (str);
for (i = 0; i < len / 2; i++)
{
FriBidiChar tmp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = tmp;
}
}
static void
index_array_reverse (
FriBidiStrIndex *arr,
const FriBidiStrIndex len
)
{
FriBidiStrIndex i;
fribidi_assert (arr);
for (i = 0; i < len / 2; i++)
{
FriBidiStrIndex tmp = arr[i];
arr[i] = arr[len - 1 - i];
arr[len - 1 - i] = tmp;
}
}
FRIBIDI_ENTRY FriBidiLevel
fribidi_reorder_line (
/* input */
FriBidiFlags flags, /* reorder flags */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len,
const FriBidiStrIndex off,
const FriBidiParType base_dir,
/* input and output */
FriBidiLevel *embedding_levels,
FriBidiChar *visual_str,
/* output */
FriBidiStrIndex *map
)
{
fribidi_boolean status = false;
FriBidiLevel max_level = 0;
if UNLIKELY
(len == 0)
{
status = true;
goto out;
}
DBG ("in fribidi_reorder_line");
fribidi_assert (bidi_types);
fribidi_assert (embedding_levels);
DBG ("reset the embedding levels, 4. whitespace at the end of line");
{
register FriBidiStrIndex i;
/* L1. Reset the embedding levels of some chars:
4. any sequence of white space characters at the end of the line. */
for (i = off + len - 1; i >= off &&
FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (bidi_types[i]); i--)
embedding_levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir);
}
/* 7. Reordering resolved levels */
{
register FriBidiLevel level;
register FriBidiStrIndex i;
/* Reorder both the outstring and the order array */
{
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_REORDER_NSM))
{
/* L3. Reorder NSMs. */
for (i = off + len - 1; i >= off; i--)
if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i])
&& bidi_types[i] == FRIBIDI_TYPE_NSM)
{
register FriBidiStrIndex seq_end = i;
level = embedding_levels[i];
for (i--; i >= off &&
FRIBIDI_IS_EXPLICIT_OR_BN_OR_NSM (bidi_types[i])
&& embedding_levels[i] == level; i--)
;
if (i < off || embedding_levels[i] != level)
{
i++;
DBG ("warning: NSM(s) at the beggining of level run");
}
if (visual_str)
{
bidi_string_reverse (visual_str + i, seq_end - i + 1);
}
if (map)
{
index_array_reverse (map + i, seq_end - i + 1);
}
}
}
/* Find max_level of the line. We don't reuse the paragraph
* max_level, both for a cleaner API, and that the line max_level
* may be far less than paragraph max_level. */
for (i = off + len - 1; i >= off; i--)
if (embedding_levels[i] > max_level)
max_level = embedding_levels[i];
/* L2. Reorder. */
for (level = max_level; level > 0; level--)
for (i = off + len - 1; i >= off; i--)
if (embedding_levels[i] >= level)
{
/* Find all stretches that are >= level_idx */
register FriBidiStrIndex seq_end = i;
for (i--; i >= off && embedding_levels[i] >= level; i--)
;
if (visual_str)
bidi_string_reverse (visual_str + i + 1, seq_end - i);
if (map)
index_array_reverse (map + i + 1, seq_end - i);
}
}
}
status = true;
out:
return status ? max_level + 1 : 0;
}
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+149
View File
@@ -0,0 +1,149 @@
/* FriBidi
* fribidi-bidi.h - bidirectional algorithm
*
* $Id: fribidi-bidi.h,v 1.15 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.15 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi.h,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001,2002 Behdad Esfahbod
* Copyright (C) 1999,2000 Dov Grobgeld
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_BIDI_H
#define _FRIBIDI_BIDI_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-flags.h"
#include "fribidi-bidi-types.h"
#include "fribidi-begindecls.h"
#define fribidi_get_par_embedding_levels FRIBIDI_NAMESPACE(get_par_embedding_levels)
/* fribidi_get_par_direction - get base paragraph direction
*
* This function finds the base direction of a single paragraph,
* as defined by rule P2 of the Unicode Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/#P2.
*
* You typically do not need this function as
* fribidi_get_par_embedding_levels() knows how to compute base direction
* itself, but you may need this to implement a more sophisticated paragraph
* direction handling. Note that you can pass more than a paragraph to this
* function and the direction of the first non-neutral paragraph is returned,
* which is a very good heuristic to set direction of the neutral paragraphs
* at the beginning of text. For other neutral paragraphs, you better use the
* direction of the previous paragraph.
*
* Returns: Base pargraph direction. No weak paragraph direction is returned,
* only LTR, RTL, or ON.
*/
FRIBIDI_ENTRY FriBidiParType fribidi_get_par_direction (
const FriBidiCharType *bidi_types, /* input list of bidi types as returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len /* input string length */
);
#define fribidi_get_par_embedding_levels FRIBIDI_NAMESPACE(get_par_embedding_levels)
/* fribidi_get_par_embedding_levels - get bidi embedding levels of a paragraph
*
* This function finds the bidi embedding levels of a single paragraph,
* as defined by the Unicode Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/. This function implements rules P2 to
* I1 inclusive, and parts 1 to 3 of L1, except for rule X9 which is
* implemented in fribidi_remove_bidi_marks(). Part 4 of L1 is implemented
* in fribidi_reorder_line().
*
* There are a few macros defined in fribidi-bidi-types.h to work with this
* embedding levels.
*
* Returns: Maximum level found plus one, or zero if any error occured
* (memory allocation failure most probably).
*/
FRIBIDI_ENTRY FriBidiLevel
fribidi_get_par_embedding_levels (
const FriBidiCharType *bidi_types, /* input list of bidi types as returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len, /* input string length of the paragraph */
FriBidiParType *pbase_dir, /* requested and resolved paragraph
* base direction */
FriBidiLevel *embedding_levels /* output list of embedding levels */
) FRIBIDI_GNUC_WARN_UNUSED;
#define fribidi_reorder_line FRIBIDI_NAMESPACE(reorder_line)
/* fribidi_reorder_line - reorder a line of logical string to visual
*
* This function reorders the characters in a line of text from logical to
* final visual order. This function implements part 4 of rule L1, and rules
* L2 and L3 of the Unicode Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/#Reordering_Resolved_Levels.
*
* As a side effect it also sets position maps if not NULL.
*
* You should provide the resolved paragraph direction and embedding levels as
* set by fribidi_get_par_embedding_levels(). Also note that the embedding
* levels may change a bit. To be exact, the embedding level of any sequence
* of white space at the end of line is reset to the paragraph embedding level
* (That is part 4 of rule L1).
*
* Note that the bidi types and embedding levels are not reordered. You can
* reorder these (or any other) arrays using the map later. The user is
* responsible to initialize map to something sensible, like an identity
* mapping, or pass NULL if no map is needed.
*
* There is an optional part to this function, which is whether non-spacing
* marks for right-to-left parts of the text should be reordered to come after
* their base characters in the visual string or not. Most rendering engines
* expect this behavior, but console-based systems for example do not like it.
* This is controlled by the FRIBIDI_FLAG_REORDER_NSM flag. The flag is on
* in FRIBIDI_FLAGS_DEFAULT.
*
* Returns: Maximum level found in this line plus one, or zero if any error
* occured (memory allocation failure most probably).
*/
FRIBIDI_ENTRY FriBidiLevel fribidi_reorder_line (
FriBidiFlags flags, /* reorder flags */
const FriBidiCharType *bidi_types, /* input list of bidi types as returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len, /* input length of the line */
const FriBidiStrIndex off, /* input offset of the beginning of the line
in the paragraph */
const FriBidiParType base_dir, /* resolved paragraph base direction */
FriBidiLevel *embedding_levels, /* input list of embedding levels,
as returned by
fribidi_get_par_embedding_levels */
FriBidiChar *visual_str, /* visual string to reorder */
FriBidiStrIndex *map /* a map of string indices which is reordered
* to reflect where each glyph ends up. */
) FRIBIDI_GNUC_WARN_UNUSED;
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_BIDI_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+130
View File
@@ -0,0 +1,130 @@
/* FriBidi
* fribidi-common.h - common include for library headers
*
* $Id: fribidi-common.h,v 1.13 2007/04/05 16:13:24 behdad Exp $
* $Author: behdad $
* $Date: 2007/04/05 16:13:24 $
* $Revision: 1.13 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-common.h,v $
*
* Author:
* Behdad Esfahbod, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_COMMON_H
#define _FRIBIDI_COMMON_H
#if DONT_HAVE_FRIBIDI_CONFIG_H+0
# define FRIBIDI "fribidi"
# define FRIBIDI_NAME "fribidi"
# define FRIBIDI_VERSION "unknown"
# define FRIBIDI_BUGREPORT "unknown"
# define FRIBIDI_INTERFACE_VERSION_STRING "unknown"
#else /* !DONT_HAVE_FRIBIDI_CONFIG_H */
# include "fribidi-config.h"
#endif /* !DONT_HAVE_FRIBIDI_CONFIG_H */
#if HAVE_FRIBIDI_CUSTOM_H+0
# include <fribidi-custom.h>
#endif /* HAVE_FRIBIDI_CUSTOM_H */
/* FRIBIDI_NAMESPACE is a macro used to name library symbols. */
#ifndef FRIBIDI_NAMESPACE
# define FRIBIDI_NAMESPACE(SYMBOL) fribidi##_##SYMBOL
#endif /* !FRIBIDI_NAMESPACE */
/* FRIBIDI_ENTRY is a macro used to declare library entry points. */
#ifndef FRIBIDI_ENTRY
# if (defined(WIN32)) || (defined(_WIN32_WCE))
# define FRIBIDI_ENTRY __declspec(dllimport)
# else /* !WIN32 */
# define FRIBIDI_ENTRY /* empty */
# endif /* !WIN32 */
#endif /* !FRIBIDI_ENTRY */
#if FRIBIDI_USE_GLIB+0
# ifndef __FRIBIDI_DOC
# include <glib/gmacros.h>
# endif /* !__FRIBIDI_DOC */
# define FRIBIDI_BEGIN_DECLS G_BEGIN_DECLS
# define FRIBIDI_END_DECLS G_END_DECLS
# define FRIBIDI_GNUC_CONST G_GNUC_CONST
# define FRIBIDI_GNUC_DEPRECATED G_GNUC_DEPRECATED
# if __GNUC__ > 2
# define FRIBIDI_GNUC_WARN_UNUSED \
__attribute__((__warn_unused_result__))
# define FRIBIDI_GNUC_MALLOC \
__attribute__((__malloc__))
# define FRIBIDI_GNUC_HIDDEN \
__attribute__((__visibility__ ("hidden")))
# else /* __GNUC__ <= 2 */
# define FRIBIDI_GNUC_WARN_UNUSED
# define FRIBIDI_GNUC_MALLOC
# define FRIBIDI_GNUC_HIDDEN
# endif /* __GNUC__ <= 2 */
#else /* !FRIBIDI_USE_GLIB */
# define FRIBIDI_GNUC_CONST
# define FRIBIDI_GNUC_DEPRECATED
# define FRIBIDI_GNUC_WARN_UNUSED
# define FRIBIDI_GNUC_MALLOC
# define FRIBIDI_GNUC_HIDDEN
#endif /* !FRIBIDI_USE_GLIB */
/* FRIBIDI_BEGIN_DECLS should be used at the beginning of your declarations,
* so that C++ compilers don't mangle their names. Use FRIBIDI_END_DECLS at
* the end of C declarations. */
#ifndef FRIBIDI_BEGIN_DECLS
# ifdef __cplusplus
# define FRIBIDI_BEGIN_DECLS extern "C" {
# define FRIBIDI_END_DECLS }
# else /* !__cplusplus */
# define FRIBIDI_BEGIN_DECLS /* empty */
# define FRIBIDI_END_DECLS /* empty */
# endif /* !__cplusplus */
#endif /* !FRIBIDI_BEGIN_DECLS */
#define fribidi_debug_status FRIBIDI_NAMESPACE(debug_status)
FRIBIDI_ENTRY int fribidi_debug_status (
void
);
#define fribidi_set_debug FRIBIDI_NAMESPACE(set_debug)
FRIBIDI_ENTRY int
fribidi_set_debug (
int state /* new state to set */
);
#endif /* !_FRIBIDI_COMMON_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+26
View File
@@ -0,0 +1,26 @@
/* lib/fribidi-config.h. Generated from fribidi-config.h.in by configure. */
/* Not copyrighted, in public domain. */
#ifndef FRIBIDI_CONFIG_H
#define FRIBIDI_CONFIG_H
#define FRIBIDI "fribidi"
#define FRIBIDI_NAME "GNU FriBidi"
#define FRIBIDI_BUGREPORT "http://fribidi.org/bug"
#define FRIBIDI_VERSION "0.19.2"
#define FRIBIDI_MAJOR_VERSION 0
#define FRIBIDI_MINOR_VERSION 19
#define FRIBIDI_MICRO_VERSION 2
#define FRIBIDI_INTERFACE_VERSION 3
#define FRIBIDI_INTERFACE_VERSION_STRING "3"
/* Define to 1 if you want charset conversion codes in the library */
#define FRIBIDI_CHARSETS 0
/* Define to 1 if you want to use glib */
#define FRIBIDI_USE_GLIB 0
/* The size of a `int', as computed by sizeof. */
#define FRIBIDI_SIZEOF_INT 4
#endif /* FRIBIDI_CONFIG_H */
@@ -0,0 +1,26 @@
/* @configure_input@ */
/* Not copyrighted, in public domain. */
#ifndef FRIBIDI_CONFIG_H
#define FRIBIDI_CONFIG_H
#define FRIBIDI "@PACKAGE@"
#define FRIBIDI_NAME "@PACKAGE_NAME@"
#define FRIBIDI_BUGREPORT "@PACKAGE_BUGREPORT@"
#define FRIBIDI_VERSION "@FRIBIDI_VERSION@"
#define FRIBIDI_MAJOR_VERSION @FRIBIDI_MAJOR_VERSION@
#define FRIBIDI_MINOR_VERSION @FRIBIDI_MINOR_VERSION@
#define FRIBIDI_MICRO_VERSION @FRIBIDI_MICRO_VERSION@
#define FRIBIDI_INTERFACE_VERSION @FRIBIDI_INTERFACE_VERSION@
#define FRIBIDI_INTERFACE_VERSION_STRING "@FRIBIDI_INTERFACE_VERSION@"
/* Define to 1 if you want charset conversion codes in the library */
#define FRIBIDI_CHARSETS @FRIBIDI_CHARSETS@
/* Define to 1 if you want to use glib */
#define FRIBIDI_USE_GLIB @FRIBIDI_USE_GLIB@
/* The size of a `int', as computed by sizeof. */
#define FRIBIDI_SIZEOF_INT @SIZEOF_INT@
#endif /* FRIBIDI_CONFIG_H */
+314
View File
@@ -0,0 +1,314 @@
/* FriBidi
* fribidi-deprecated.c - deprecated interfaces.
*
* $Id: fribidi-deprecated.c,v 1.6 2006/06/01 22:53:55 behdad Exp $
* $Author: behdad $
* $Date: 2006/06/01 22:53:55 $
* $Revision: 1.6 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-deprecated.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001,2002 Behdad Esfahbod
* Copyright (C) 1999,2000 Dov Grobgeld
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#undef FRIBIDI_NO_DEPRECATED
#include <fribidi-deprecated.h>
#include <fribidi.h>
#if FRIBIDI_NO_DEPRECATED+0
#else
static FriBidiFlags flags = FRIBIDI_FLAGS_DEFAULT | FRIBIDI_FLAGS_ARABIC;
FRIBIDI_ENTRY fribidi_boolean
fribidi_set_mirroring (
/* input */
fribidi_boolean state
)
{
return FRIBIDI_ADJUST_AND_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_MIRRORING, state);
}
FRIBIDI_ENTRY fribidi_boolean
fribidi_mirroring_status (
void
)
{
return FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_MIRRORING);
}
FRIBIDI_ENTRY fribidi_boolean
fribidi_set_reorder_nsm (
/* input */
fribidi_boolean state
)
{
return FRIBIDI_ADJUST_AND_TEST_BITS (flags, FRIBIDI_FLAG_REORDER_NSM, state);
}
fribidi_boolean
fribidi_reorder_nsm_status (
void
)
{
return FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_REORDER_NSM);
}
FRIBIDI_ENTRY FriBidiLevel
fribidi_log2vis_get_embedding_levels (
const FriBidiCharType *bidi_types, /* input list of bidi types as returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len, /* input string length of the paragraph */
FriBidiParType *pbase_dir, /* requested and resolved paragraph
* base direction */
FriBidiLevel *embedding_levels /* output list of embedding levels */
)
{
return fribidi_get_par_embedding_levels (bidi_types, len, pbase_dir, embedding_levels);
}
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_type (
FriBidiChar ch /* input character */
)
{
return fribidi_get_bidi_type (ch);
}
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_type_internal (
FriBidiChar ch /* input character */
)
{
return fribidi_get_bidi_type (ch);
}
FRIBIDI_ENTRY FriBidiStrIndex
fribidi_remove_bidi_marks (
FriBidiChar *str,
const FriBidiStrIndex len,
FriBidiStrIndex *positions_to_this,
FriBidiStrIndex *position_from_this_list,
FriBidiLevel *embedding_levels
)
{
register FriBidiStrIndex i, j = 0;
fribidi_boolean private_from_this = false;
fribidi_boolean status = false;
if UNLIKELY
(len == 0)
{
status = true;
goto out;
}
DBG ("in fribidi_remove_bidi_marks");
fribidi_assert (str);
/* If to_this is not NULL, we must have from_this as well. If it is
not given by the caller, we have to make a private instance of it. */
if (positions_to_this && !position_from_this_list)
{
position_from_this_list = fribidi_malloc (sizeof
(position_from_this_list[0]) *
len);
if UNLIKELY
(!position_from_this_list) goto out;
private_from_this = true;
for (i = 0; i < len; i++)
position_from_this_list[positions_to_this[i]] = i;
}
for (i = 0; i < len; i++)
if (!FRIBIDI_IS_EXPLICIT_OR_BN (fribidi_get_bidi_type (str[i]))
&& str[i] != FRIBIDI_CHAR_LRM && str[i] != FRIBIDI_CHAR_RLM)
{
str[j] = str[i];
if (embedding_levels)
embedding_levels[j] = embedding_levels[i];
if (position_from_this_list)
position_from_this_list[j] = position_from_this_list[i];
j++;
}
/* Convert the from_this list to to_this */
if (positions_to_this)
{
for (i = 0; i < len; i++)
positions_to_this[i] = -1;
for (i = 0; i < len; i++)
positions_to_this[position_from_this_list[i]] = i;
}
status = true;
out:
if (private_from_this)
fribidi_free (position_from_this_list);
return status ? j : -1;
}
FRIBIDI_ENTRY FriBidiLevel
fribidi_log2vis (
/* input */
const FriBidiChar *str,
FriBidiStrIndex len,
/* input and output */
FriBidiParType *pbase_dir,
/* output */
FriBidiChar *visual_str,
FriBidiStrIndex *positions_L_to_V,
FriBidiStrIndex *positions_V_to_L,
FriBidiLevel *embedding_levels
)
{
register FriBidiStrIndex i;
FriBidiLevel max_level = 0;
fribidi_boolean private_V_to_L = false;
fribidi_boolean private_embedding_levels = false;
fribidi_boolean status = false;
FriBidiArabicProp *ar_props = NULL;
FriBidiCharType *bidi_types = NULL;
if UNLIKELY
(len == 0)
{
status = true;
goto out;
}
DBG ("in fribidi_log2vis");
fribidi_assert (str);
fribidi_assert (pbase_dir);
bidi_types = fribidi_malloc (len * sizeof bidi_types[0]);
if (!bidi_types)
goto out;
fribidi_get_bidi_types (str, len, bidi_types);
if (!embedding_levels)
{
embedding_levels = fribidi_malloc (len * sizeof embedding_levels[0]);
if (!embedding_levels)
goto out;
private_embedding_levels = true;
}
max_level = fribidi_get_par_embedding_levels (bidi_types, len, pbase_dir,
embedding_levels) - 1;
if UNLIKELY
(max_level < 0) goto out;
/* If l2v is to be calculated we must have v2l as well. If it is not
given by the caller, we have to make a private instance of it. */
if (positions_L_to_V && !positions_V_to_L)
{
positions_V_to_L =
(FriBidiStrIndex *) fribidi_malloc (sizeof (FriBidiStrIndex) * len);
if (!positions_V_to_L)
goto out;
private_V_to_L = true;
}
/* Set up the ordering array to identity order */
if (positions_V_to_L)
{
for (i = 0; i < len; i++)
positions_V_to_L[i] = i;
}
if (visual_str)
{
/* Using memcpy instead
for (i = len - 1; i >= 0; i--)
visual_str[i] = str[i];
*/
memcpy (visual_str, str, len * sizeof (*visual_str));
/* Arabic joining */
ar_props = fribidi_malloc (len * sizeof ar_props[0]);
fribidi_get_joining_types (str, len, ar_props);
fribidi_join_arabic (bidi_types, len, embedding_levels, ar_props);
fribidi_shape (flags, embedding_levels, len, ar_props, visual_str);
}
/* line breaking goes here, but we assume one line in this function */
/* and this should be called once per line, but again, we assume one
* line in this deprecated function */
status =
fribidi_reorder_line (flags, bidi_types, len, 0, *pbase_dir,
embedding_levels, visual_str,
positions_V_to_L);
/* Convert the v2l list to l2v */
if (positions_L_to_V)
{
for (i = 0; i < len; i++)
positions_L_to_V[i] = -1;
for (i = 0; i < len; i++)
positions_L_to_V[positions_V_to_L[i]] = i;
}
out:
if (private_V_to_L)
fribidi_free (positions_V_to_L);
if (private_embedding_levels)
fribidi_free (embedding_levels);
if (ar_props)
fribidi_free (ar_props);
if (bidi_types)
fribidi_free (bidi_types);
return status ? max_level + 1 : 0;
}
#endif /* !FRIBIDI_NO_DEPRECATED */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+243
View File
@@ -0,0 +1,243 @@
/* FriBidi
* fribidi-deprecated.h - Deprecated interfaces
*
* $Id: fribidi-deprecated.h,v 1.3 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.3 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-deprecated.h,v $
*
* Author:
* Behdad Esfahbod, 2004, 2005
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2004, 2005 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_DEPRECATED_H
#define _FRIBIDI_DEPRECATED_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-bidi-types.h"
#include "fribidi-begindecls.h"
#define fribidi_mirroring_status FRIBIDI_NAMESPACE(mirroring_status)
/* fribidi_mirroring_status - get current mirroring status
*
* This function is deprecated and only used with other deprecated functions.
*/
FRIBIDI_ENTRY fribidi_boolean fribidi_mirroring_status (
void
) FRIBIDI_GNUC_DEPRECATED;
#define fribidi_set_mirroring FRIBIDI_NAMESPACE(set_mirroring)
/* fribidi_set_mirroring - set mirroring on or off
*
* This function is used to turn character mirroring on or off.
* Character mirroring is the act of replacing a mirrorable glyph
* (character), eg. left paranthesis, with the matching glyph,
* eg. right paranthesis, in a right-to-left resolved context.
* If your rendering engine does mirroring itself, you may want to
* turn it off here.
*
* This flag is on by default.
* This function is deprecated and only used with other deprecated functions.
*
* Returns: the new mirroring status.
*/
FRIBIDI_ENTRY fribidi_boolean fribidi_set_mirroring (
fribidi_boolean state /* new state to set */
) FRIBIDI_GNUC_DEPRECATED;
#define fribidi_reorder_nsm_status FRIBIDI_NAMESPACE(reorder_nsm_status)
/* fribidi_reorder_nsm_status - get current marks reordering status
*
* This function is deprecated and only used with other deprecated functions.
*/
FRIBIDI_ENTRY fribidi_boolean fribidi_reorder_nsm_status (
void
) FRIBIDI_GNUC_DEPRECATED;
#define fribidi_set_reorder_nsm FRIBIDI_NAMESPACE(set_reorder_nsm)
/* fribidi_set_reorder_nsm - set marks reordering on or off
*
* This function is used to turn non-spacing marks reordering on or
* off. Reordering non-spacing marks is the act of placing non-spacing
* marks (bidi class NSM) after their base character in a right-to-left
* resolved context. If your rendering engine expects non-spacing marks
* always after the base character in the memory representation of the
* visual string, you need this option on. An example of where people
* may need it off is when rendering in the console when non-spacing
* marks cannot be applied on top of the base character.
*
* This flag is on by default.
* This function is deprecated and only used with other deprecated functions.
*
* Returns: the new marks reordering status.
*/
FRIBIDI_ENTRY fribidi_boolean fribidi_set_reorder_nsm (
fribidi_boolean state /* new state to set */
) FRIBIDI_GNUC_DEPRECATED;
/* fribidi_log2vis_get_embedding_levels - get embedding levels
*
* Deprecated. Replaced by fribidi_get_par_embedding_levels.
*/
#define fribidi_log2vis_get_embedding_levels FRIBIDI_NAMESPACE(log2vis_get_embedding_levels)
FRIBIDI_ENTRY FriBidiLevel
fribidi_log2vis_get_embedding_levels (
const FriBidiCharType *bidi_types, /* input list of bidi types as returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len, /* input string length of the paragraph */
FriBidiParType *pbase_dir, /* requested and resolved paragraph
* base direction */
FriBidiLevel *embedding_levels /* output list of embedding levels */
) FRIBIDI_GNUC_DEPRECATED;
/* fribidi_get_type - get character bidi type
*
* Deprecated. Replaced by fribidi_get_bidi_type.
*/
#define fribidi_get_type FRIBIDI_NAMESPACE(get_type)
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_type (
FriBidiChar ch /* input character */
) FRIBIDI_GNUC_DEPRECATED;
/* fribidi_get_type_internal - get character bidi type
*
* Deprecated. Replaced by fribidi_get_bidi_type.
*/
#define fribidi_get_type_internal FRIBIDI_NAMESPACE(get_type_internal)
FRIBIDI_ENTRY FriBidiCharType
fribidi_get_type_internal (
FriBidiChar ch /* input character */
) FRIBIDI_GNUC_DEPRECATED;
#define fribidi_remove_bidi_marks FRIBIDI_NAMESPACE(remove_bidi_marks)
/* fribidi_remove_bidi_marks - remove bidi marks out of an string
*
* This function removes the bidi and boundary-neutral marks out of an string
* and the accompanying lists. It implements rule X9 of the Unicode
* Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/#X9, with the exception that it removes
* U+200E LEFT-TO-RIGHT MARK and U+200F RIGHT-TO-LEFT MARK too.
*
* If any of the input lists are NULL, the list is skipped. If str is the
* visual string, then positions_to_this is positions_L_to_V and
* position_from_this_list is positions_V_to_L; if str is the logical
* string, the other way. Moreover, the position maps should be filled with
* valid entries.
*
* A position map pointing to a removed character is filled with -1. By the
* way, you should not use embedding_levels if str is visual string.
*
* For best results this function should be run on a whole paragraph, not
* lines; but feel free to do otherwise if you know what you are doing.
* Deprecated. Use fribidi_remove_special_chars instead.
*
* Returns: New length of the string, or -1 if an error occured (memory
* allocation failure most probably).
*/
FRIBIDI_ENTRY FriBidiStrIndex
fribidi_remove_bidi_marks (
FriBidiChar *str, /* input string to clean */
const FriBidiStrIndex len, /* input string length */
FriBidiStrIndex *positions_to_this, /* list mapping positions to the
order used in str */
FriBidiStrIndex *position_from_this_list, /* list mapping positions from the
order used in str */
FriBidiLevel *embedding_levels /* list of embedding levels */
)
FRIBIDI_GNUC_WARN_UNUSED FRIBIDI_GNUC_DEPRECATED;
#define fribidi_log2vis FRIBIDI_NAMESPACE(log2vis)
/* fribidi_log2vis - get visual string
*
* This function converts the logical input string to the visual output
* strings as specified by the Unicode Bidirectional Algorithm. As a side
* effect it also generates mapping lists between the two strings, and the
* list of embedding levels as defined by the algorithm.
*
* If NULL is passed as any of the the lists, the list is ignored and not
* filled.
*
* This function is obsolete because it only handles one-line paragraphs.
* Please consider using other functions instead. Deprecated.
*
* Returns: Maximum level found plus one, or zero if any error occured
* (memory allocation failure most probably).
*/
FRIBIDI_ENTRY FriBidiLevel fribidi_log2vis (
const FriBidiChar *str, /* input logical string */
const FriBidiStrIndex len, /* input string length */
FriBidiParType *pbase_dir, /* requested and resolved paragraph
* base direction */
FriBidiChar *visual_str, /* output visual string */
FriBidiStrIndex *positions_L_to_V, /* output mapping from logical to
* visual string positions */
FriBidiStrIndex *positions_V_to_L, /* output mapping from visual string
* back to the logical string
* positions */
FriBidiLevel *embedding_levels /* output list of embedding levels */
)
FRIBIDI_GNUC_WARN_UNUSED FRIBIDI_GNUC_DEPRECATED;
#define UNI_MAX_BIDI_LEVEL FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL
#define UNI_LRM FRIBIDI_CHAR_LRM
#define UNI_RLM FRIBIDI_CHAR_RLM
#define UNI_LRE FRIBIDI_CHAR_LRE
#define UNI_RLE FRIBIDI_CHAR_RLE
#define UNI_LRO FRIBIDI_CHAR_LRO
#define UNI_RLO FRIBIDI_CHAR_RLO
#define UNI_LS FRIBIDI_CHAR_LS
#define UNI_PS FRIBIDI_CHAR_PS
#define UNI_ZWNJ FRIBIDI_CHAR_ZWNJ
#define UNI_ZWJ FRIBIDI_CHAR_ZWJ
#define UNI_HEBREW_ALEF FRIBIDI_CHAR_HEBREW_ALEF
#define UNI_ARABIC_ALEF FRIBIDI_CHAR_ARABIC_ALEF
#define UNI_ARABIC_ZERO FRIBIDI_CHAR_ARABIC_ZERO
#define UNI_FARSI_ZERO FRIBIDI_CHAR_PERSIAN_ZERO
#define FRIBIDI_TYPE_WL FRIBIDI_PAR_WLTR
#define FRIBIDI_TYPE_WR FRIBIDI_PAR_WRTL
#define FRIBIDI_TYPE_L FRIBIDI_PAR_LTR
#define FRIBIDI_TYPE_R FRIBIDI_PAR_RTL
#define FRIBIDI_TYPE_N FRIBIDI_PAR_ON
#define FRIBIDI_TYPE_B FRIBIDI_TYPE_BS
#define FRIBIDI_TYPE_S FRIBIDI_TYPE_SS
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_DEPRECATED_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
@@ -0,0 +1,3 @@
#ifdef FRIBIDI_END_DECLS
FRIBIDI_END_DECLS
#endif /* FRIBIDI_END_DECLS */
+78
View File
@@ -0,0 +1,78 @@
/* FriBidi
* fribidi-flags.h - option flags
*
* $Id: fribidi-flags.h,v 1.1 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.1 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-flags.h,v $
*
* Author:
* Behdad Esfahbod, 2005
*
* Copyright (C) 2005 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_FLAGS_H
#define _FRIBIDI_FLAGS_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-begindecls.h"
typedef fribidi_uint32 FriBidiFlags;
/*
* Define option flags that various functions use. Each mask has
* only one bit set.
*/
#define FRIBIDI_FLAG_SHAPE_MIRRORING 0x00000001
#define FRIBIDI_FLAG_REORDER_NSM 0x00000002
#define FRIBIDI_FLAG_SHAPE_ARAB_PRES 0x00000100
#define FRIBIDI_FLAG_SHAPE_ARAB_LIGA 0x00000200
#define FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE 0x00000400
#define FRIBIDI_FLAG_REMOVE_BIDI 0x00010000
#define FRIBIDI_FLAG_REMOVE_JOINING 0x00020000
#define FRIBIDI_FLAG_REMOVE_SPECIALS 0x00040000
/*
* And their combinations.
*/
#define FRIBIDI_FLAGS_DEFAULT ( \
FRIBIDI_FLAG_SHAPE_MIRRORING | \
FRIBIDI_FLAG_REORDER_NSM | \
FRIBIDI_FLAG_REMOVE_SPECIALS )
#define FRIBIDI_FLAGS_ARABIC ( \
FRIBIDI_FLAG_SHAPE_ARAB_PRES | \
FRIBIDI_FLAG_SHAPE_ARAB_LIGA )
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_FLAGS_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
@@ -0,0 +1,50 @@
#ifndef __FRIBIDI_DOC
/* FriBidi
* fribidi-joining-types-list.h - list of joining types
*
* $Id: fribidi-joining-types-list.h,v 1.2 2004/06/15 11:52:02 behdad Exp $
* $Author: behdad $
* $Date: 2004/06/15 11:52:02 $
* $Revision: 1.2 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-joining-types-list.h,v $
*
* Author:
* Behdad Esfahbod, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2004 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
/* *INDENT-OFF* */
#endif /* !__FRIBIDI_DOC */
#ifndef _FRIBIDI_ADD_TYPE
# define _FRIBIDI_ADD_TYPE(x,y)
#endif
_FRIBIDI_ADD_TYPE (U, '|') /* nUn-joining, e.g. Full Stop */
_FRIBIDI_ADD_TYPE (R, '<') /* Right-joining, e.g. Arabic Letter Dal */
_FRIBIDI_ADD_TYPE (D, '+') /* Dual-joining, e.g. Arabic Letter Ain */
_FRIBIDI_ADD_TYPE (C, '-') /* join-Causing, e.g. Tatweel, ZWJ */
_FRIBIDI_ADD_TYPE (T, '^') /* Transparent, e.g. Arabic Fatha */
_FRIBIDI_ADD_TYPE (L, '>') /* Left-joining, i.e. fictional */
_FRIBIDI_ADD_TYPE (G, '~') /* iGnored, e.g. LRE, RLE, ZWNBSP */
#ifndef __FRIBIDI_DOC
/* *INDENT-ON* */
#endif /* !__FRIBIDI_DOC */
@@ -0,0 +1,118 @@
/* FriBidi
* fribidi-joining-types.c - character joining types
*
* $Id: fribidi-joining-types.c,v 1.5 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.5 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-joining-types.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-joining-types.h>
#include "joining-types.h"
enum FriBidiJoiningTypeShortEnum
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) TYPE = FRIBIDI_JOINING_TYPE_##TYPE,
# include "fribidi-joining-types-list.h"
# undef _FRIBIDI_ADD_TYPE
_FRIBIDI_NUM_TYPES
};
#include "joining-type.tab.i"
FRIBIDI_ENTRY FriBidiJoiningType
fribidi_get_joining_type (
/* input */
FriBidiChar ch
)
{
return FRIBIDI_GET_JOINING_TYPE (ch);
}
FRIBIDI_ENTRY void
fribidi_get_joining_types (
/* input */
const FriBidiChar *str,
const FriBidiStrIndex len,
/* output */
FriBidiJoiningType *jtypes
)
{
register FriBidiStrIndex i = len;
for (; i; i--)
{
*jtypes++ = FRIBIDI_GET_JOINING_TYPE (*str);
str++;
}
}
FRIBIDI_ENTRY const char *
fribidi_get_joining_type_name (
/* input */
FriBidiJoiningType j
)
{
switch (j)
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_JOINING_TYPE_##TYPE: return STRINGIZE(TYPE);
# include "fribidi-joining-types-list.h"
# undef _FRIBIDI_ADD_TYPE
default:
return "?";
}
}
#if DEBUG+0
char
fribidi_char_from_joining_type (
/* input */
FriBidiJoiningType j,
fribidi_boolean visual
)
{
/* switch left and right if on visual run */
if (visual & ((FRIBIDI_JOINS_RIGHT (j) && !FRIBIDI_JOINS_LEFT (j)) |
(!FRIBIDI_JOINS_RIGHT (j) && FRIBIDI_JOINS_LEFT (j))))
j ^= FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT;
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
if (FRIBIDI_IS_JOINING_TYPE_##TYPE(j)) return SYMBOL;
# include "fribidi-joining-types-list.h"
# undef _FRIBIDI_ADD_TYPE
return '?';
}
#endif /* DEBUG */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
@@ -0,0 +1,258 @@
/* FriBidi
* fribidi-joining-types.h - character joining types
*
* $Id: fribidi-joining-types.h,v 1.5 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.5 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-joining-types.h,v $
*
* Author:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_JOINING_TYPES_H
#define _FRIBIDI_JOINING_TYPES_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-begindecls.h"
/*
* Define bit masks that joining types are based on, each mask has
* only one bit set.
*/
#define FRIBIDI_MASK_JOINS_RIGHT 0x01 /* May join to right */
#define FRIBIDI_MASK_JOINS_LEFT 0x02 /* May join to right */
#define FRIBIDI_MASK_ARAB_SHAPES 0x04 /* May Arabic shape */
#define FRIBIDI_MASK_TRANSPARENT 0x08 /* Is transparent */
#define FRIBIDI_MASK_IGNORED 0x10 /* Is ignored */
#define FRIBIDI_MASK_LIGATURED 0x20 /* Is ligatured */
/*
* Define values for FriBidiJoiningType
*/
/* nUn-joining */
#define FRIBIDI_JOINING_TYPE_U_VAL ( 0 )
/* Right-joining */
#define FRIBIDI_JOINING_TYPE_R_VAL \
( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_ARAB_SHAPES )
/* Dual-joining */
#define FRIBIDI_JOINING_TYPE_D_VAL \
( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT \
| FRIBIDI_MASK_ARAB_SHAPES )
/* join-Causing */
#define FRIBIDI_JOINING_TYPE_C_VAL \
( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT )
/* Left-joining */
#define FRIBIDI_JOINING_TYPE_L_VAL \
( FRIBIDI_MASK_JOINS_LEFT | FRIBIDI_MASK_ARAB_SHAPES )
/* Transparent */
#define FRIBIDI_JOINING_TYPE_T_VAL \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_ARAB_SHAPES )
/* iGnored */
#define FRIBIDI_JOINING_TYPE_G_VAL ( FRIBIDI_MASK_IGNORED )
enum _FriBidiJoiningTypeEnum
{
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
FRIBIDI_JOINING_TYPE_##TYPE = FRIBIDI_JOINING_TYPE_##TYPE##_VAL,
# include "fribidi-joining-types-list.h"
# undef _FRIBIDI_ADD_TYPE
_FRIBIDI_JOINING_TYPE_JUNK /* Don't use this */
};
#ifdef __FRIBIDI_DOC
typedef enum _FriBidiJoiningTypeEnum FriBidiJoiningType;
#else /* !__FRIBIDI_DOC */
typedef fribidi_uint8 FriBidiJoiningType;
#endif /* !__FRIBIDI_DOC */
/* FriBidiArabicProp is essentially the same type as FriBidiJoiningType, but
* not limited to the few values returned by fribidi_get_joining_type. */
typedef fribidi_uint8 FriBidiArabicProp;
/*
* The equivalent of JoiningType values for ArabicProp
*/
/* Primary Arabic Joining Classes (Table 8-2) */
/* nUn-joining */
#define FRIBIDI_IS_JOINING_TYPE_U(p) \
( 0 == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
/* Right-joining */
#define FRIBIDI_IS_JOINING_TYPE_R(p) \
( FRIBIDI_MASK_JOINS_RIGHT == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
/* Dual-joining */
#define FRIBIDI_IS_JOINING_TYPE_D(p) \
( ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT \
| FRIBIDI_MASK_ARAB_SHAPES ) == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT \
| FRIBIDI_MASK_ARAB_SHAPES ) ) )
/* join-Causing */
#define FRIBIDI_IS_JOINING_TYPE_C(p) \
( ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT \
| FRIBIDI_MASK_ARAB_SHAPES ) ) )
/* Left-joining */
#define FRIBIDI_IS_JOINING_TYPE_L(p) \
( FRIBIDI_MASK_JOINS_LEFT == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
/* Transparent */
#define FRIBIDI_IS_JOINING_TYPE_T(p) \
( FRIBIDI_MASK_TRANSPARENT == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED ) ) )
/* iGnored */
#define FRIBIDI_IS_JOINING_TYPE_G(p) \
( FRIBIDI_MASK_IGNORED == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED ) ) )
/* and for Derived Arabic Joining Classes (Table 8-3) */
/* Right join-Causing */
#define FRIBIDI_IS_JOINING_TYPE_RC(p) \
( FRIBIDI_MASK_JOINS_RIGHT == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_RIGHT ) ) )
/* Left join-Causing */
#define FRIBIDI_IS_JOINING_TYPE_LC(p) \
( FRIBIDI_MASK_JOINS_LEFT == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_JOINS_LEFT ) ) )
/*
* Defining macros for needed queries, It is fully dependent on the
* implementation of FriBidiJoiningType.
*/
/* Joins to right: R, D, C? */
#define FRIBIDI_JOINS_RIGHT(p) ((p) & FRIBIDI_MASK_JOINS_RIGHT)
/* Joins to left: L, D, C? */
#define FRIBIDI_JOINS_LEFT(p) ((p) & FRIBIDI_MASK_JOINS_LEFT)
/* May shape: R, D, L, T? */
#define FRIBIDI_ARAB_SHAPES(p) ((p) & FRIBIDI_MASK_ARAB_SHAPES)
/* Is skipped in joining: T, G? */
#define FRIBIDI_IS_JOIN_SKIPPED(p) \
((p) & (FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED))
/* Is base that will be shaped: R, D, L? */
#define FRIBIDI_IS_JOIN_BASE_SHAPES(p) \
( FRIBIDI_MASK_ARAB_SHAPES == ( (p) & \
( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED \
| FRIBIDI_MASK_ARAB_SHAPES ) ) )
#define FRIBIDI_JOINS_PRECEDING_MASK(level) \
(FRIBIDI_LEVEL_IS_RTL (level) ? FRIBIDI_MASK_JOINS_RIGHT \
: FRIBIDI_MASK_JOINS_LEFT)
#define FRIBIDI_JOINS_FOLLOWING_MASK(level) \
(FRIBIDI_LEVEL_IS_RTL (level) ? FRIBIDI_MASK_JOINS_LEFT \
: FRIBIDI_MASK_JOINS_RIGHT)
#define FRIBIDI_JOIN_SHAPE(p) \
((p) & ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ))
/* Functions finally */
#define fribidi_get_joining_type FRIBIDI_NAMESPACE(get_joining_type)
/* fribidi_get_joining_type - get character joining type
*
* This function returns the joining type of a character as defined in Table
* 8-2 Primary Arabic Joining Classes of the Unicode standard available at
* http://www.unicode.org/versions/Unicode4.0.0/ch08.pdf#G7462, using data
* provided in file ArabicShaping.txt and UnicodeData.txt of the Unicode
* Character Database available at
* http://www.unicode.org/Public/UNIDATA/ArabicShaping.txt and
* http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.
*
* There are a few macros defined in fribidi-joining-types.h for querying a
* joining type.
*/
FRIBIDI_ENTRY FriBidiJoiningType
fribidi_get_joining_type (
FriBidiChar ch /* input character */
) FRIBIDI_GNUC_CONST;
#define fribidi_get_joining_types FRIBIDI_NAMESPACE(get_joining_types)
/* fribidi_get_joining_types - get joining types for an string of characters
*
* This function finds the joining types of an string of characters. See
* fribidi_get_joining_type for more information about the joining types
* returned by this function.
*/
FRIBIDI_ENTRY void fribidi_get_joining_types (
const FriBidiChar *str, /* input string */
const FriBidiStrIndex len, /* input string length */
FriBidiJoiningType *jtypes /* output joining types */
);
#define fribidi_get_joining_type_name FRIBIDI_NAMESPACE(get_joining_type_name)
/* fribidi_get_joining_type_name - get joining type name
*
* This function returns the joining type name of a joining type. The
* returned string is a static string and should not be freed.
*
* The type names are the same as ones defined in Table 8-2 Primary Arabic
* Joining Classes of the Unicode standard available at
* http://www.unicode.org/versions/Unicode4.0.0/ch08.pdf#G7462.
*/
FRIBIDI_ENTRY const char *fribidi_get_joining_type_name (
FriBidiJoiningType j /* input joining type */
) FRIBIDI_GNUC_CONST;
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_JOINING_TYPES_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+193
View File
@@ -0,0 +1,193 @@
/* FriBidi
* fribidi-joining.h - Arabic joining algorithm
*
* $Id: fribidi-joining.c,v 1.6 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.6 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-joining.c,v $
*
* Authors:
* Behdad Esfahbod, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2004 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-joining.h>
#include "mem.h"
#include "bidi-types.h"
#include "joining-types.h"
#if DEBUG+0
/*======================================================================
* For debugging, define some functions for printing joining types and
* properties.
*----------------------------------------------------------------------*/
static void
print_joining_types (
/* input */
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len,
const FriBidiJoiningType *jtypes
)
{
register FriBidiStrIndex i;
fribidi_assert (jtypes);
MSG (" Join. types: ");
for (i = 0; i < len; i++)
MSG2 ("%c", fribidi_char_from_joining_type (jtypes[i],
!FRIBIDI_LEVEL_IS_RTL
(embedding_levels[i])));
MSG ("\n");
}
#endif /* DEBUG */
#define FRIBIDI_CONSISTENT_LEVEL(i) \
(FRIBIDI_IS_EXPLICIT_OR_BN (bidi_types[(i)]) \
? FRIBIDI_SENTINEL \
: embedding_levels[(i)])
#define FRIBIDI_LEVELS_MATCH(i, j) \
((i) == (j) || (i) == FRIBIDI_SENTINEL || (j) == FRIBIDI_SENTINEL)
FRIBIDI_ENTRY void
fribidi_join_arabic (
/* input */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len,
const FriBidiLevel *embedding_levels,
/* input and output */
FriBidiArabicProp *ar_props
)
{
if UNLIKELY
(len == 0) return;
DBG ("in fribidi_join_arabic");
fribidi_assert (bidi_types);
fribidi_assert (embedding_levels);
fribidi_assert (ar_props);
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_joining_types (embedding_levels, len, ar_props);
}
# endif /* DEBUG */
/* The joining algorithm turned out very very dirty :(. That's what happens
* when you follow the standard which has never been implemented closely
* before.
*/
/* 8.2 Arabic - Cursive Joining */
DBG ("Arabic cursive joining");
{
/* The following do not need to be initialized as long as joins is
* initialized to false. We just do to turn off compiler warnings. */
register FriBidiStrIndex saved = 0;
register FriBidiLevel saved_level = FRIBIDI_SENTINEL;
register fribidi_boolean saved_shapes = false;
register FriBidiArabicProp saved_joins_following_mask = 0;
register fribidi_boolean joins = false;
register FriBidiStrIndex i;
for (i = 0; i < len; i++)
if (!FRIBIDI_IS_JOINING_TYPE_G (ar_props[i]))
{
register fribidi_boolean disjoin = false;
register fribidi_boolean shapes = FRIBIDI_ARAB_SHAPES (ar_props[i]);
register FriBidiLevel level = FRIBIDI_CONSISTENT_LEVEL (i);
if (joins && !FRIBIDI_LEVELS_MATCH (saved_level, level))
{
disjoin = true;
joins = false;
}
if (!FRIBIDI_IS_JOIN_SKIPPED (ar_props[i]))
{
register const FriBidiArabicProp joins_preceding_mask =
FRIBIDI_JOINS_PRECEDING_MASK (level);
if (!joins)
{
if (shapes)
FRIBIDI_UNSET_BITS (ar_props[i], joins_preceding_mask);
}
else if (!FRIBIDI_TEST_BITS (ar_props[i], joins_preceding_mask))
{
disjoin = true;
}
else
{
register FriBidiStrIndex j;
/* This is a FriBidi extension: we set joining properties
* for skipped characters in between, so we can put NSMs on tatweel
* later if we want. Useful on console for example.
*/
for (j = saved + 1; j < i; j++)
FRIBIDI_SET_BITS (ar_props[j], joins_preceding_mask | saved_joins_following_mask);
}
}
if (disjoin && saved_shapes)
FRIBIDI_UNSET_BITS (ar_props[saved], saved_joins_following_mask);
if (!FRIBIDI_IS_JOIN_SKIPPED (ar_props[i]))
{
saved = i;
saved_level = level;
saved_shapes = shapes;
saved_joins_following_mask =
FRIBIDI_JOINS_FOLLOWING_MASK (level);
joins =
FRIBIDI_TEST_BITS (ar_props[i], saved_joins_following_mask);
}
}
if ((joins) && saved_shapes)
FRIBIDI_UNSET_BITS (ar_props[saved], saved_joins_following_mask);
}
# if DEBUG
if UNLIKELY
(fribidi_debug_status ())
{
print_joining_types (embedding_levels, len, ar_props);
}
# endif /* DEBUG */
DBG ("leaving fribidi_join_arabic");
}
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+81
View File
@@ -0,0 +1,81 @@
/* FriBidi
* fribidi-joining.h - Arabic joining algorithm
*
* $Id: fribidi-joining.h,v 1.3 2004/06/21 21:15:31 behdad Exp $
* $Author: behdad $
* $Date: 2004/06/21 21:15:31 $
* $Revision: 1.3 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-joining.h,v $
*
* Authors:
* Behdad Esfahbod, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2004 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_JOINING_H
#define _FRIBIDI_JOINING_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-bidi-types.h"
#include "fribidi-joining-types.h"
#include "fribidi-begindecls.h"
#define fribidi_join_arabic FRIBIDI_NAMESPACE(join_arabic)
/* fribidi_join_arabic - do Arabic joining
*
* This function does the Arabic joining algorithm. Means, given Arabic
* joining types of the characters in ar_props (don't worry,
* FriBidiJoiningType can be casted to FriBidiArabicProp automagically), this
* function modifies this properties to grasp the effect of neighboring
* characters. You probably need this information later to do Arabic shaping.
*
* This function implements rules R1 to R7 inclusive (all rules) of the Arabic
* Cursive Joining algorithm of the Unicode standard as available at
* http://www.unicode.org/versions/Unicode4.0.0/ch08.pdf#G7462. It also
* interacts correctly with the bidirection algorithm as defined in Section
* 3.5 Shaping of the Unicode Bidirectional Algorithm available at
* http://www.unicode.org/reports/tr9/#Shaping.
*
* There are a few macros defined in fribidi-joining-types.h for querying the
* Arabic properties computed by this function.
*/
FRIBIDI_ENTRY void fribidi_join_arabic (
const FriBidiCharType *bidi_types, /* input list of bidi types as
returned by
fribidi_get_bidi_types() */
const FriBidiStrIndex len, /* input string length */
const FriBidiLevel *embedding_levels, /* input list of embedding
levels, as returned by
fribidi_get_par_embedding_levels */
FriBidiArabicProp *ar_props /* Arabic properties to analyze, initilized by
joining types, as returned by
fribidi_get_joining_types */
);
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_JOINING_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+140
View File
@@ -0,0 +1,140 @@
/* FriBidi
* fribidi-mem.c - memory manipulation routines
*
* $Id: fribidi-mem.c,v 1.8 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.8 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-mem.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001,2002 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include "mem.h"
#if FRIBIDI_USE_GLIB+0
#else
#if USE_SIMPLE_MALLOC+0
#else
struct _FriBidiMemChunk
{
int atom_size;
int area_size;
int empty_size;
void *chunk;
};
FriBidiMemChunk *
fribidi_mem_chunk_new (
/* input */
const char *name,
int atom_size,
unsigned long area_size,
int alloc_type
)
{
register FriBidiMemChunk *m;
fribidi_assert (area_size >= atom_size * 8);
m = (FriBidiMemChunk *) fribidi_malloc (sizeof (FriBidiMemChunk));
if LIKELY
(m)
{
m->atom_size = atom_size;
m->area_size = area_size;
m->empty_size = 0;
m->chunk = NULL;
}
return m;
}
void *
fribidi_mem_chunk_alloc (
/* input */
FriBidiMemChunk *mem_chunk
)
{
fribidi_assert (mem_chunk);
if UNLIKELY
(mem_chunk->empty_size < mem_chunk->atom_size)
{
register void *chunk = fribidi_malloc (mem_chunk->area_size);
if LIKELY
(chunk)
{
if (mem_chunk->chunk)
*(void **) chunk =
(char *) mem_chunk->chunk + mem_chunk->empty_size -
mem_chunk->area_size;
chunk = (char *) chunk + mem_chunk->atom_size;
mem_chunk->chunk = chunk;
mem_chunk->empty_size = mem_chunk->area_size - mem_chunk->atom_size;
}
else
return NULL;
}
{
register void *m = mem_chunk->chunk;
mem_chunk->chunk = (char *) mem_chunk->chunk + mem_chunk->atom_size;
mem_chunk->empty_size -= mem_chunk->atom_size;
return m;
}
}
void
fribidi_mem_chunk_destroy (
/* input */
FriBidiMemChunk *mem_chunk
)
{
register void *chunk;
fribidi_assert (mem_chunk);
chunk =
(char *) mem_chunk->chunk + mem_chunk->empty_size - mem_chunk->area_size;
while LIKELY
(chunk)
{
register void *tofree = chunk;
chunk = *(void **) chunk;
fribidi_free (tofree);
}
fribidi_free (mem_chunk);
}
#endif /* !USE_SIMPLE_MALLOC */
#endif /* !FRIBIDI_USE_GLIB */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
@@ -0,0 +1,96 @@
/* fribidi-mirroring.c - get mirrored character
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001, 2002, 2004 Behdad Esfahbod
* Copyright (C) 1999, 2000 Dov Grobgeld
*
* This file is part of GNU FriBidi.
*
* GNU FriBidi is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* GNU FriBidi is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with GNU FriBidi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For licensing issues, contact <license@farsiweb.info> or write to
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
*/
/* $Id: fribidi-mirroring.c,v 1.15 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.15 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-mirroring.c,v $
*
* Author(s):
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*/
#include "common.h"
#include <fribidi-mirroring.h>
#include "mirroring.tab.i"
FRIBIDI_ENTRY fribidi_boolean
fribidi_get_mirror_char (
/* input */
FriBidiChar ch,
/* output */
FriBidiChar *mirrored_ch
)
{
register FriBidiChar result;
result = FRIBIDI_GET_MIRRORING (ch);
if (mirrored_ch)
*mirrored_ch = result;
return ch != result ? true : false;
}
FRIBIDI_ENTRY void
fribidi_shape_mirroring (
/* input */
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len,
/* input and output */
FriBidiChar *str
)
{
register FriBidiStrIndex i;
DBG ("in fribidi_shape_mirroring");
if UNLIKELY
(len == 0 || !str) return;
fribidi_assert (embedding_levels);
/* L4. Mirror all characters that are in odd levels and have mirrors. */
for (i = len - 1; i >= 0; i--)
if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i]))
{
FriBidiChar mirrored_ch;
if (fribidi_get_mirror_char (str[i], &mirrored_ch))
str[i] = mirrored_ch;
}
}
/* Editor directions:
* Local Variables:
* mode: c
* c-basic-offset: 2
* indent-tabs-mode: t
* tab-width: 8
* End:
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
*/
@@ -0,0 +1,94 @@
/* fribidi-mirroring.h - get mirrored character
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001, 2002, 2004 Behdad Esfahbod
* Copyright (C) 1999, 2000 Dov Grobgeld
*
* This file is part of GNU FriBidi.
*
* GNU FriBidi is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* GNU FriBidi is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with GNU FriBidi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For licensing issues, contact <license@farsiweb.info> or write to
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
*/
/* $Id: fribidi-mirroring.h,v 1.10 2004/09/28 07:58:57 behdad Exp $
* $Author: behdad $
* $Date: 2004/09/28 07:58:57 $
* $Revision: 1.10 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-mirroring.h,v $
*
* Author(s):
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*/
#ifndef _FRIBIDI_MIRRORING_H
#define _FRIBIDI_MIRRORING_H
#include "fribidi-common.h"
#include "fribidi-types.h"
#include "fribidi-bidi-types.h"
#include "fribidi-begindecls.h"
#define fribidi_get_mirror_char FRIBIDI_NAMESPACE(get_mirror_char)
/* fribidi_get_mirror_char - get mirrored character
*
* This function finds the mirrored equivalent of a character as defined in
* the file BidiMirroring.txt of the Unicode Character Database available at
* http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt.
*
* If the input character is a declared as a mirroring character in the
* Unicode standard and has a mirrored equivalent. The matching mirrored
* character is put in the output, otherwise the input character itself is
* put.
*
* Returns: if the character has a mirroring equivalent or not.
*/
FRIBIDI_ENTRY fribidi_boolean fribidi_get_mirror_char (
FriBidiChar ch, /* input character */
FriBidiChar *mirrored_ch /* output mirrored character */
);
#define fribidi_shape_mirroring FRIBIDI_NAMESPACE(shape_mirroring)
/* fribidi_shape_mirroring - do mirroring shaping
*
* This functions replaces mirroring characters on right-to-left embeddings in
* string with their mirrored equivalent as returned by
* fribidi_get_mirror_char().
*
* This function implements rule L4 of the Unicode Bidirectional Algorithm
* available at http://www.unicode.org/reports/tr9/#L4.
*/
FRIBIDI_ENTRY void fribidi_shape_mirroring (
const FriBidiLevel *embedding_levels, /* input list of embedding
levels, as returned by
fribidi_get_par_embedding_levels */
const FriBidiStrIndex len, /* input string length */
FriBidiChar *str /* string to shape */
);
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_MIRRORING_H */
/* Editor directions:
* Local Variables:
* mode: c
* c-basic-offset: 2
* indent-tabs-mode: t
* tab-width: 8
* End:
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
*/
+376
View File
@@ -0,0 +1,376 @@
/* FriBidi
* fribidi-run.c - text run data type
*
* $Id: fribidi-run.c,v 1.8 2006/01/31 03:23:13 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/31 03:23:13 $
* $Revision: 1.8 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-run.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2001,2002 Behdad Esfahbod
* Copyright (C) 1999,2000 Dov Grobgeld
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-bidi-types.h>
#include "run.h"
#include "mem.h"
#include "bidi-types.h"
#if USE_SIMPLE_MALLOC+0
#else
static FriBidiRun *free_runs = NULL;
#endif
FriBidiRun *
new_run (
void
)
{
register FriBidiRun *run;
#if USE_SIMPLE_MALLOC+0
run = fribidi_malloc (sizeof (FriBidiRun));
#else /* !USE_SIMPLE_MALLOC */
if (free_runs)
{
run = free_runs;
free_runs = run->next;
}
else
{
static FriBidiMemChunk *run_mem_chunk = NULL;
if UNLIKELY
(!run_mem_chunk)
run_mem_chunk = fribidi_chunk_new_for_type (FriBidiRun);
if LIKELY
(run_mem_chunk)
run = fribidi_chunk_new (FriBidiRun, run_mem_chunk);
else
run = NULL;
}
#endif /* !USE_SIMPLE_MALLOC */
if LIKELY
(run)
{
run->len = run->pos = run->level = 0;
run->next = run->prev = NULL;
}
return run;
}
void
free_run (
/* input */
FriBidiRun *run
)
{
fribidi_assert (run);
#if USE_SIMPLE_MALLOC+0
fribidi_free (run);
#else /* !USE_SIMPLE_MALLOC */
run->next = free_runs;
free_runs = run;
#endif /* !USE_SIMPLE_MALLOC */
}
FriBidiRun *
new_run_list (
void
)
{
register FriBidiRun *run;
run = new_run ();
if LIKELY
(run)
{
run->type = FRIBIDI_TYPE_SENTINEL;
run->level = FRIBIDI_SENTINEL;
run->pos = FRIBIDI_SENTINEL;
run->len = FRIBIDI_SENTINEL;
run->next = run->prev = run;
}
return run;
}
void
free_run_list (
FriBidiRun *run_list
)
{
if (!run_list)
return;
fribidi_validate_run_list (run_list);
#if USE_SIMPLE_MALLOC+0
{
register FriBidiRun *pp;
pp = run_list;
pp->prev->next = NULL;
while LIKELY
(pp)
{
register FriBidiRun *p;
p = pp;
pp = pp->next;
free_run (p);
};
}
#else /* !USE_SIMPLE_MALLOC */
run_list->prev->next = free_runs;
free_runs = run_list;
#endif /* !USE_SIMPLE_MALLOC */
}
FriBidiRun *
run_list_encode_bidi_types (
/* input */
const FriBidiCharType *bidi_types,
const FriBidiStrIndex len
)
{
FriBidiRun *list, *last;
register FriBidiRun *run = NULL;
FriBidiStrIndex i;
fribidi_assert (bidi_types);
/* Create the list sentinel */
list = new_run_list ();
if UNLIKELY
(!list) return NULL;
last = list;
/* Scan over the character types */
for (i = 0; i < len; i++)
{
register FriBidiCharType char_type = bidi_types[i];
if (char_type != last->type)
{
run = new_run ();
if UNLIKELY
(!run) break;
run->type = char_type;
run->pos = i;
last->len = run->pos - last->pos;
last->next = run;
run->prev = last;
last = run;
}
}
/* Close the circle */
last->len = len - last->pos;
last->next = list;
list->prev = last;
if UNLIKELY
(!run)
{
/* Memory allocation failed */
free_run_list (list);
return NULL;
}
fribidi_validate_run_list (list);
return list;
}
/* override the run list 'base', with the runs in the list 'over', to
reinsert the previously-removed explicit codes (at X9) from
'explicits_list' back into 'type_rl_list' for example. This is used at the
end of I2 to restore the explicit marks, and also to reset the character
types of characters at L1.
it is assumed that the 'pos' of the first element in 'base' list is not
more than the 'pos' of the first element of the 'over' list, and the
'pos' of the last element of the 'base' list is not less than the 'pos'
of the last element of the 'over' list. these two conditions are always
satisfied for the two usages mentioned above.
Note:
frees the over list.
Todo:
use some explanatory names instead of p, q, ...
rewrite comment above to remove references to special usage.
*/
fribidi_boolean
shadow_run_list (
/* input */
FriBidiRun *base,
FriBidiRun *over,
fribidi_boolean preserve_length
)
{
register FriBidiRun *p = base, *q, *r, *s, *t;
register FriBidiStrIndex pos = 0, pos2;
fribidi_boolean status = false;
fribidi_validate_run_list (base);
fribidi_validate_run_list (over);
for_run_list (q, over)
{
if UNLIKELY
(!q->len || q->pos < pos) continue;
pos = q->pos;
while (p->next->type != FRIBIDI_TYPE_SENTINEL && p->next->pos <= pos)
p = p->next;
/* now p is the element that q must be inserted 'in'. */
pos2 = pos + q->len;
r = p;
while (r->next->type != FRIBIDI_TYPE_SENTINEL && r->next->pos < pos2)
r = r->next;
if (preserve_length)
r->len += q->len;
/* now r is the last element that q affects. */
if LIKELY
(p == r)
{
/* split p into at most 3 intervals, and insert q in the place of
the second interval, set r to be the third part. */
/* third part needed? */
if (p->pos + p->len > pos2)
{
r = new_run ();
if UNLIKELY
(!r) goto out;
p->next->prev = r;
r->next = p->next;
r->level = p->level;
r->type = p->type;
r->len = p->pos + p->len - pos2;
r->pos = pos2;
}
else
r = r->next;
if LIKELY
(p->pos + p->len >= pos)
{
/* first part needed? */
if (p->pos < pos)
/* cut the end of p. */
p->len = pos - p->pos;
else
{
t = p;
p = p->prev;
free_run (t);
}
}
}
else
{
if LIKELY
(p->pos + p->len >= pos)
{
/* p needed? */
if (p->pos < pos)
/* cut the end of p. */
p->len = pos - p->pos;
else
p = p->prev;
}
/* r needed? */
if (r->pos + r->len > pos2)
{
/* cut the begining of r. */
r->len = r->pos + r->len - pos2;
r->pos = pos2;
}
else
r = r->next;
/* remove the elements between p and r. */
for (s = p->next; s != r;)
{
t = s;
s = s->next;
free_run (t);
}
}
/* before updating the next and prev runs to point to the inserted q,
we must remember the next element of q in the 'over' list.
*/
t = q;
q = q->prev;
delete_node (t);
p->next = t;
t->prev = p;
t->next = r;
r->prev = t;
}
status = true;
fribidi_validate_run_list (base);
out:
free_run_list (over);
return status;
}
#if DEBUG+0
void
fribidi_validate_run_list (
FriBidiRun *run_list /* input run list */
)
{
register FriBidiRun *q;
fribidi_assert (run_list);
fribidi_assert (run_list->next);
fribidi_assert (run_list->next->prev == run_list);
fribidi_assert (run_list->type == FRIBIDI_TYPE_SENTINEL);
for_run_list (q, run_list)
{
fribidi_assert (q->next);
fribidi_assert (q->next->prev == q);
}
fribidi_assert (q == run_list);
}
#endif /* !DEBUG */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+69
View File
@@ -0,0 +1,69 @@
/* FriBidi
* fribidi-shape.c - shaping
*
* $Id: fribidi-shape.c,v 1.1 2005/11/03 01:39:01 behdad Exp $
* $Author: behdad $
* $Date: 2005/11/03 01:39:01 $
* $Revision: 1.1 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-shape.c,v $
*
* Authors:
* Behdad Esfahbod, 2001, 2002, 2004
* Dov Grobgeld, 1999, 2000
*
* Copyright (C) 2005 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#include "common.h"
#include <fribidi-shape.h>
#include <fribidi-mirroring.h>
#include <fribidi-arabic.h>
FRIBIDI_ENTRY void
fribidi_shape (
/* input */
FriBidiFlags flags,
const FriBidiLevel *embedding_levels,
const FriBidiStrIndex len,
/* input and output */
FriBidiArabicProp *ar_props,
FriBidiChar *str
)
{
if UNLIKELY
(len == 0 || !str) return;
DBG ("in fribidi_shape");
fribidi_assert (embedding_levels);
if (ar_props)
fribidi_shape_arabic (flags, embedding_levels, len, ar_props, str);
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_MIRRORING))
fribidi_shape_mirroring (embedding_levels, len, str);
}
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/
+78
View File
@@ -0,0 +1,78 @@
/* FriBidi
* fribidi-shape.h - shaping
*
* $Id: fribidi-shape.h,v 1.2 2006/01/14 12:09:29 behdad Exp $
* $Author: behdad $
* $Date: 2006/01/14 12:09:29 $
* $Revision: 1.2 $
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-shape.h,v $
*
* Author:
* Behdad Esfahbod, 2004, 2005
*
* Copyright (C) 2004 Sharif FarsiWeb, Inc
* Copyright (C) 2004, 2005 Behdad Esfahbod
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library, in a file named COPYING; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA
*
* For licensing issues, contact <license@farsiweb.info>.
*/
#ifndef _FRIBIDI_SHAPE_H
#define _FRIBIDI_SHAPE_H
#include "fribidi-types.h"
#include "fribidi-flags.h"
#include "fribidi-bidi-types.h"
#include "fribidi-joining-types.h"
#include "fribidi-begindecls.h"
#define fribidi_shape FRIBIDI_NAMESPACE(shape)
/* fribidi_shape - do bidi-aware shaping
*
* This function does all shaping work that depends on the resolved embedding
* levels of the characters. Currently it does mirroring and Arabic shaping,
* but the list may grow in the future. This function is a wrapper around
* fribidi_shape_mirroring and fribidi_shape_arabic.
*
* The flags parameter specifies which shapings are applied. The only flags
* affecting the functionality of this function are those beginning with
* FRIBIDI_FLAG_SHAPE_. Of these, only FRIBIDI_FLAG_SHAPE_MIRRORING is on
* in FRIBIDI_FLAGS_DEFAULT. For details of the Arabic-specific flags see
* fribidi_shape_arabic. If ar_props is NULL, no Arabic shaping is performed.
*
* Feel free to do your own shaping before or after calling this function,
* but you should take care of embedding levels yourself then.
*/
FRIBIDI_ENTRY void fribidi_shape (
FriBidiFlags flags, /* shaping flags */
const FriBidiLevel *embedding_levels, /* input list of embedding
levels, as returned by
fribidi_get_par_embedding_levels */
const FriBidiStrIndex len, /* input string length */
FriBidiArabicProp *ar_props, /* input/output Arabic properties as
* computed by fribidi_join_arabic */
FriBidiChar *str /* string to shape */
);
#include "fribidi-enddecls.h"
#endif /* !_FRIBIDI_SHAPE_H */
/* Editor directions:
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
*/

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