[XP][VXA] Localization

Started by ForeverZer0, July 26, 2012, 09:39:00 pm

Previous topic - Next topic

Rahvin

Thanks for the reply.

I'm using \loc[id] in my script, it's just a typo in my thread.

KK20

Having not worked with VXA before, I'm not sure if this script--which is designed for XP--will work in VXA.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Rahvin

Yes, I'm afraid that this is the reason  :'(.

Unfortunately I did'nt find any other script for VX Ace.
Perhaps someone could take a look at the script and tell me what I have to modifiy to work under VX Ace. The script itself is not very large.

By the way, I did not find the definition of /loc[ID] in the script?
Where can I find the defintion of such commands in general?

KK20

April 15, 2013, 03:45:36 am #23 Last Edit: April 15, 2013, 10:17:28 pm by KK20
Downloaded VXA. Man this logical process is much more confusing than XP.
Spoiler: ShowHide

#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
# Localization
# Edit for VX-ACE by KK20
# Author: ForeverZer0
# Version: 1.1
# Date: 7.26.12
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
#                             VERSION HISTORY
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
# v.1.0  7.26.12
#   - Initial release
# v.1.1  7.27.12
#   - Added ability to use any string as the ID instead of just numbers
#   - Added an alert message when a string is not found in the localization
#     file and the game is being ran in DEBUG mode
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
#
# Introduction:
#   This script adds support for creating games that support multiple languages.
#   The files for each culture are located externally so that they can be easily
#   translated and used by simply dropping the language file into the games
#   "Localization" folder.
#
# Features:
#   - Uses IDs to get strings from external .ini files, which can be easily
#     edited in any text editor such as Notepad
#   - Supports special characters used by non-English languages
#   - Included message commands to simplify making your multilangual game, you
#     use the command the same as you would the normal switch and variable
#     commands
#   - Also supports using in the Bitmap#draw_text methods so that custom scripts
#     that draw onto Sprite bitmaps instead of Windows will still work without
#     the need for customization
#   - Automatically saves/loads the current culture
#
# Instructions:
#   - Place the script anywhere in the editor
#   - Define the name of the language directory and default culture below
#   - The names of the cultures can be anything, I would stick to the convention
#     of naming files in the normal convention of "language-region" initials,
#     such as "en-US" (English, USA), "es-ES" (Spanish, Spain), etc., etc.
#   - Each language file should be a file with an .INI extension. If you are
#     unfamiliar with how .ini files are written, do a quick Google search, they
#     are quite simple.
#   - The .ini file should have only one section, which is the name of the
#     culture.
#             ex. [en-US]
#             ex. [es-ES]
#   - After that, you can simply begin to write the id-value pairs of each
#     string used in the culture.
#             ex. 1=This is a string
#             ex. 2=This is a string with ID 2
#             ex. GameIntro_01=This is a string with ID "GameIntro_01"
#   - Most importantly, the files must be saved in UTF-8 WITHOUT BOM. BOM stands
#     for "byte-order marker" and is a two byte value that is written to UTF8
#     files as a marker to other applications that they are encoded in UTF8.
#     WinAPI does not support this, so it must be saved without it. The text
#     will not appear if you fail to do this.
#   - Simply drop the completed files into the Localization folder
#   - To change the culture in game, use the following script command:
#         Localization.culture = CULTURE
#     CULTURE should be a string value that is the name of the file, without
#     extension
#             ex. Localization.culture = "en-US"
#  
#+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

#===============================================================================
# ** Localization
#-------------------------------------------------------------------------------
# Static module for reading localized strings from language files.
#===============================================================================

module Localization
 #-----------------------------------------------------------------------------
 # * Constants
 #-----------------------------------------------------------------------------
 DIRECTORY = "Localization"
 DEFAULT_CULTURE = 'en-US'
 #-----------------------------------------------------------------------------
 # * Public instance variables.
 #-----------------------------------------------------------------------------
 attr_reader :culture
 attr_reader :filename
 #-----------------------------------------------------------------------------
 # * Initialize the localization module
 #-----------------------------------------------------------------------------
 def self.init
   @ini = Win32API.new('kernel32', 'GetPrivateProfileString', 'PPPPLP', 'L')
   unless File.directory?(DIRECTORY)
     Dir.mkdir(DIRECTORY)
   end
   path = ".\\#{DIRECTORY}\\CurrentCulture.txt"
   self.culture = File.exists?(path) ? IO.readlines(path)[0] : DEFAULT_CULTURE
 end
 #-----------------------------------------------------------------------------
 # * Set the current culture
 #-----------------------------------------------------------------------------
 def self.culture=(value)
   filename = ".\\#{DIRECTORY}\\#{value}.ini"
   if File.exists?(filename)
     @culture = value
     @filename = filename
     path = ".\\#{DIRECTORY}\\CurrentCulture.txt"
     File.open(path, 'wb') {|file| file.write(@culture) }
   else
     print "Cannot find language file for \"#{value}\"\n" +
       "Please ensure that the file \"#{filename}\" exists."
   end
 end
 #-----------------------------------------------------------------------------
 # * Read the string with the given ID of the current culture
 #-----------------------------------------------------------------------------
 def self.read(id)
   text = "\0" * 256
   @ini.call(@culture, id, '', text, 256, @filename)
   text.delete!("\0")
   if text == '' && $DEBUG
     print "No string defined!\nKey: \"#{id}\"\nCulture: \"#{@culture}\""
   end
   return text
 end
 #-----------------------------------------------------------------------------
 # * Parses a string for localization codes and returns it
 #-----------------------------------------------------------------------------
 def self.localize(string)
   if string != nil
     return string.gsub(/\\[Ll][Oo][Cc]\[(.+)\]/) { self.read($1) }
   end
 end
end

#===============================================================================
# ** Game_Message
#===============================================================================

class Game_Message
  alias localized_text_add add
  def add(text)
    text = Localization.localize(text)
    strings = text.split("\\n")
    while strings.size > 0
      localized_text_add(strings.shift)
    end
  end
end

#===============================================================================
# ** Window_Base
#===============================================================================

class Window_Base
 alias localize_draw_text_ex draw_text_ex
 def draw_text_ex(x, y, text)
   text = Localization.localize(text)
   localize_draw_text_ex(x, y, text)
 end
end

#===============================================================================
# ** Bitmap
#===============================================================================

class Bitmap
 #-----------------------------------------------------------------------------
 # * Replaces text based on the current culture
 #-----------------------------------------------------------------------------
 alias localized_draw_text draw_text
 def draw_text(*args)
   args.each_index {|i|
     args[i] = Localization.localize(args[i]) if args[i].is_a?(String) }
   localized_draw_text(*args)
 end
end

# Initialize static variables used in the module
Localization.init

If everything goes well, I'll tack this onto the OP.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Blizzard

April 15, 2013, 03:56:29 am #24 Last Edit: April 15, 2013, 03:58:16 am by Blizzard
If you want to mess arround a bit with automatic locale detection as well, here's some C++ code that should help you.

Code: cpp
			info.locale = "en"; // default is "en"
wchar_t locale[LOCALE_NAME_MAX_LENGTH] = {0};
int length = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME,
locale, (LOCALE_NAME_MAX_LENGTH - 1) * sizeof(wchar_t));
if (length > 0)
{
info.locale = hstr::from_unicode(locale).lower();
if (info.locale.utf8_size() > 2)
{
info.locale = info.locale.utf8_substr(0, 2);
}
}


info.locale is a hstring, derived from std::string. The only problematic function would be hstr::from_unicode, but I implemented that one in my input module so you can reuse that. Also, hstring::operator() does the same as substr (first parameter is index, second is length).

EDIT: Hm... I fixed that to properly detect UTF8 codepoints.
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Rahvin

@KK20:
Thanks a lot, the script works fine :). What exactly did you change?!

@Blizzard:
Thanks for the tip. At the moment I stick to manual localization ;).

Rahvin

One issue ;):

Linebreaks are not working as mentioned in the thread before.

Can anyone tell me how rpg maker handels linebreaks?

I'd like to try to write something as using <br> in my localization-files for linebreaks and
replace them in rpg maker with correct linebreaks.
Any idea how to do this?

By the way, this forum is really great. Thanks for your support :)!

KK20

April 15, 2013, 05:43:00 pm #27 Last Edit: April 15, 2013, 10:15:34 pm by KK20
Replace Game_Message in my edit with this one:

#===============================================================================
# ** Game_Message
#===============================================================================

class Game_Message
  alias localized_text_add add
  def add(text)
    text = Localization.localize(text)
    strings = text.split("\\n")
    while strings.size > 0
      localized_text_add(strings.shift)
    end
  end
end

Now you can do something like this in the text files:
Quote1=This is the first string.\nNow the text is on the next line.
2=Double Line break!\n\nTada!
3=Actor name: \N[1] is not the same as \n line break.\n[1] won't return actor name obviously.


As for the exact changes I made, I replaced Game_Temp with the two classes Game_Message and Window_Base. Messages were interpreted through Game_Temp in RMXP, but in VXA it's done in these classes.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Rahvin

Thanks you very very much :)! Works great!

Rahvin

Unfortunately I'm facing another problem :(, perhaps you can help me once again.

I'd like to use this quest-log script: http://rmrk.net/index.php/topic,45127.0.html

You have do edit the quest-details in the script. Of course I need them localized, too.

I placed the quest-log-script under the localization script in the script editor and I have tried something like this in line 779 of the script:
q[:name]              = Localization.localize("quest_name")


Unfortunately the text shown in the quest_log is "quest_name" and not the localized text.
How can I call the localization script inside another script?

KK20

April 18, 2013, 06:25:55 pm #30 Last Edit: April 22, 2013, 04:37:55 pm by KK20

q[:name] = Localization.localize("\\loc[quest_name]")


EDIT:
Modified the first post to include the VXA edit I created.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Tassilo

Most wonderful, we are successfully using it for our 16-Bit version of Days of Dawn (https://www.kickstarter.com/projects/bumblebee/days-of-dawn-discover-the-magic).
Would it be possible to add a "change language" button to the main menu? One that cycles through the available languages and would keep it's name in english. Thus is would be named "Switch language", no matter which one is selected, but cycle through the currently installed language files one after another, showcasing the chosen language by updating the other title screen entries to that language.
Could anybody maybe assist me in doing such?
Thank you very much!
All the best,
Tassilo

Zexion

Sure i can do that if you send me the scripts involved.

Tassilo

That would be super-fantastic!
I'm currently using Title Arranger as found on http://area91.multiverseworks.com/blog/rmvxa_script/menu/title_rearranger to extend my title screen menu.
What I'd love to have now is a "Switch language" entry that would cycle through "Localization"'s available languages.

Thank you so much,
Tassilo

Quote from: Zexion on January 02, 2015, 03:37:23 pm
Sure i can do that if you send me the scripts involved.

Zexion

January 04, 2015, 09:30:54 pm #34 Last Edit: January 05, 2015, 06:58:41 am by Zexion
I wasn't sure how to do this without closing the command window to refresh it, so I'm sorry if that isn't what you wanted. The button changes the current Language but to see the results, you have to change the words themselves to the \loc[ID] version.
"New Game", "Continue", and "Exit" are in the database under the "Terms" tab.
"Game over" is in this script on line 176.
Spoiler: ShowHide
#==============================================================================
#
# GaryCXJk - Title Rearranger v1.00
# * Last Updated: 2012.12.28
# * Level: Easy
# * Requires: N/A
#
#==============================================================================

$imported = {} if $imported.nil?
$imported["CXJ-TitleRearranger"] = true

#==============================================================================
#
# Changelog:
#
#------------------------------------------------------------------------------
# 2012.12.30 - v1.00
#
# * Initial release
#
#==============================================================================
#
# I have the tendency to write test code, and sometimes I want to see the
# results without having to go through the main game. At other times, I just
# want to add new functionality to the title screen, for example, to have a
# settings menu, or to show a credits screen.
#
# Which is why I made this script. Because I'm a programmer, ergo, because I'm
# lazy.
#
#==============================================================================
#
# Installation:
#
# Make sure to put this below Materials, but above Main Process.
#
# This script adds aliases for several methods. If you are sure no method that
# is used by other scripts get overridden, you can place it anywhere,
# otherwise, make sure this script is loaded after any other script overriding
# these methods, otherwise this script stops working.
#
#------------------------------------------------------------------------------
# Aliased methods:
#
# * class Window_TitleCommand
#   - make_command_list
# * class Scene_Title
#   - create_command_window
#
#==============================================================================
#
# Usage:
#
# This script generally is plug-and-play, and therefore requires nothing much.
# All you have to do is follow the instructions of the part that can be
# modified safely, which I hope is clear enough to understand. After that it's
# just running the script.
#
#==============================================================================
#
# License:
#
# Creative Commons Attribution 3.0 Unported
#
# The complete license can be read here:
# http://creativecommons.org/licenses/by/3.0/legalcode
#
# The license as it is described below can be read here:
# http://creativecommons.org/licenses/by/3.0/deed
#
# You are free:
#
# to Share -- to copy, distribute and transmit the work
# to Remix -- to adapt the work
# to make commercial use of the work
#
# Under the following conditions:
#
# Attribution -- You must attribute the work in the manner specified by the
# author or licensor (but not in any way that suggests that they endorse you or
# your use of the work).
#
# With the understanding that:
#
# Waiver -- Any of the above conditions can be waived if you get permission from
# the copyright holder.
#
# Public Domain -- Where the work or any of its elements is in the public domain
# under applicable law, that status is in no way affected by the license.
#
# Other Rights -- In no way are any of the following rights affected by the
# license:
#
# * Your fair dealing or fair use rights, or other applicable copyright
#   exceptions and limitations;
# * The author's moral rights;
# * Rights other persons may have either in the work itself or in how the work
#   is used, such as publicity or privacy rights.
#
# Notice -- For any reuse or distribution, you must make clear to others the
# license terms of this work. The best way to do this is with a link to this
# web page.
#
#------------------------------------------------------------------------------
# Extra notes:
#
# Despite what the license tells you, I will not hunt down anybody who doesn't
# follow the license in regards to giving credits. However, as it is common
# courtesy to actually do give credits, it is recommended that you do.
#
# As I picked this license, you are free to share this script through any
# means, which includes hosting it on your own website, selling it on eBay and
# hang it in the bathroom as toilet paper. Well, not selling it on eBay, that's
# a dick move, but you are still free to redistribute the work.
#
# Yes, this license means that you can use it for both non-commercial as well
# as commercial software.
#
# You are free to pick the following names when you give credit:
#
# * GaryCXJk
# * Gary A.M. Kertopermono
# * G.A.M. Kertopermono
# * GARYCXJK
#
# Personally, when used in commercial games, I prefer you would use the second
# option. Not only will it actually give me more name recognition in real
# life, which also works well for my portfolio, it will also look more
# professional. Also, do note that I actually care about capitalization if you
# decide to use my username, meaning, capital C, capital X, capital J, lower
# case k. Yes, it might seem stupid, but it's one thing I absolutely care
# about.
#
# Finally, if you want my endorsement for your product, if it's good enough
# and I have the game in my posession, I might endorse it. Do note that if you
# give me the game for free, it will not affect my opinion of the game. It
# would be nice, but if I really did care for the game I'd actually purchase
# it. Remember, the best way to get any satisfaction is if you get people to
# purchase the game, so in a way, I prefer it if you don't actually give me
# a free copy.
#
# This script was originally hosted on:
# http://area91.multiverseworks.com
#
#==============================================================================
#
# The code below defines the settings of this script, and are there to be
# modified.
#
#==============================================================================

module CXJ
 module TITLE_REARRANGER
   
   #------------------------------------------------------------------------
   # Add the commands in the order you want it to be displayed.
   #------------------------------------------------------------------------
   COMMANDS = [
   :new_game,
   :continue,
   :switch_language,
   :gameover,
   :shutdown,
   ]
   
   #------------------------------------------------------------------------
   # Add handlers for your meth ods here. This assumes you know scripting.
   # Both the activation state flag and the extra arbitrary data are called
   # using methods, as the data is most likely dynamic and therefore cannot
   # be initialized here. You can leave these two out if you're not going
   # to use them, or set them as nil.
   #------------------------------------------------------------------------
   NEW_COMMANDS = {
   # :command  => [ "Display Name",  Handler Method, Enabled Method, Ext Data Method],
     :gameover => [ "Game Over",   :cxj_tr_gameover, nil, nil],
     :switch_language => [ "Language", :zex_sw_lang, nil, nil ],
   }
   
   #------------------------------------------------------------------------
   # Add methods below, or in the class Scene_Title.
   # It is preferable to add them to the Scene_Title class for better
   # compatibility, which is why there is a special block below. However,
   # in most instances you could put the methods here if you want to, for
   # example to keep the code as clean as possible.
   #------------------------------------------------------------------------
 end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#------------------------------------------------------------------------------
#  Add methods below.
#==============================================================================
class Scene_Title < Scene_Base
 #--------------------------------------------------------------------------
 # * Show Game Over Screen
 #--------------------------------------------------------------------------
 def cxj_tr_gameover
   close_command_window
   SceneManager.call(Scene_Gameover)
 end
 #--------------------------------------------------------------------------
 # * Change the current language
 #--------------------------------------------------------------------------
 def zex_sw_lang
   # Close the Command Window while updating
   close_command_window
   # Initialize if needed
   if @lang_index == nil
     # Initialize language variables
     @lang_index = 0
     @languages = Dir.entries(Localization::DIRECTORY)
     # Deletes non language entries from the array
     @languages.delete(".")
     @languages.delete("..")
     @languages.delete("CurrentLanguage.txt")
     # Removes .ini from file names
     @languages.each{|lang| lang.slice!(".ini")}
     # Set the total number of languages
     @size = @languages.size - 1
   end
   # Increase the index
   if @lang_index < @size
     @lang_index += 1
   else
     @lang_index = 0
   end
   # Change Current Language
   Localization.language = @languages[@lang_index]
   # Open command window in new language
   create_command_window
 end
end

#==============================================================================
#
# The code below should not be altered unless you know what you're doing.
#
#==============================================================================

#==============================================================================
# ** Window_TitleCommand
#------------------------------------------------------------------------------
#  This window is for selecting New Game/Continue on the title screen.
#==============================================================================

class Window_TitleCommand < Window_Command
 #--------------------------------------------------------------------------
 # * Alias: Create Command List
 #--------------------------------------------------------------------------
 alias window_titlecommand_make_command_list_cxj_tr make_command_list
 def make_command_list
   window_titlecommand_make_command_list_cxj_tr
   CXJ::TITLE_REARRANGER::NEW_COMMANDS.each do |key, value|
     is_enabled = true
     if value.size > 2 && !value[2].nil?
       enabled_method = method(value[2]) if respond_to?(value[2])
       enabled_method = CXJ::TITLE_REARRANGER.method(value[2]) if enabled_method.nil? && CXJ::TITLE_REARRANGER.respond_to?(value[2])
       is_enabled = enabled_method.call if(!enabled_method.nil?)
     end
     ext = nil
     if value.size > 3 && !value[3].nil?
       ext_method = method(value[3]) if respond_to?(value[3])
       ext_method = CXJ::TITLE_REARRANGER.method(value[3]) if ext_method.nil? && CXJ::TITLE_REARRANGER.respond_to?(value[3])
       ext = ext_method.call if !ext_method.nil?
     end
     add_command(value[0], key, is_enabled, ext)
   end
   command_list = CXJ::TITLE_REARRANGER::COMMANDS
   new_list = Array.new(command_list.size)
   @list.each do |value|
     next if !command_list.include?(value[:symbol])
     new_list[command_list.index(value[:symbol])] = value
   end
   @list = new_list
 end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base
 #--------------------------------------------------------------------------
 # * Alias: Create Command Window
 #--------------------------------------------------------------------------
 alias scene_title_create_command_window_cxj_tr create_command_window
 def create_command_window
   scene_title_create_command_window_cxj_tr
   CXJ::TITLE_REARRANGER::NEW_COMMANDS.each do |key, value|
     handler_method = method(value[1]) if respond_to?(value[1])
     handler_method = CXJ::TITLE_REARRANGER.method(value[1]) if handler_method.nil? && CXJ::TITLE_REARRANGER.respond_to?(value[1])
     @command_window.set_handler(key, handler_method) if !handler_method.nil?
   end
 end
end

Tassilo

Wow, outstanding, thanks a lot!
I'm running into an error right now though: Switching the language, I'm getting
"Script 'Title Rearranger' line 242: NoMethodError occured.
undefined method 'language=' for Localization:Module.


The line (in my version of the script) is:
   
Localization.language = @languages[@lang_index]

The Localization-script is placed above the TitleArranger script in the project.

Thanks so much!

Zexion

January 05, 2015, 06:56:08 am #36 Last Edit: January 05, 2015, 06:59:37 am by Zexion
I forgot to mention that it bases the language on the filename itself instead of reading the first line of the file (just because they should be the same). So if your file name is "English.ini" and the actual language code is en-US then it won't work :s

Just incase, what are the contents of the 'Localization' folder?

Or even, did you rename the localization folder, because I forgot to even take that into account. fixed

Tassilo

In my /Localization there is:
CurrentCulture.txt (containing "en-US")
de-DE.ini
en-US.ini

Zexion

January 05, 2015, 08:05:25 am #38 Last Edit: January 05, 2015, 08:12:56 am by Zexion
Did you modify the script in anyway? Because I'm testing it out on a blank project and it works fine with the same files and everything o.o

You could try adding :
msgbox @languages[@lang_index]
above the error line and tell me what it says.

Tassilo

January 06, 2015, 02:55:54 am #39 Last Edit: January 06, 2015, 03:32:11 am by KK20
I did some (minor) modifications, like localizing the entries and adding a credits entry. I just tried with your exact copy of TitleRearranger and keep getting the same error.
Requesting the lang_index gives me "de_DE", which is correct and would be the next language to chose.

Quote from: Zexion on January 05, 2015, 08:05:25 am
Did you modify the script in anyway? Because I'm testing it out on a blank project and it works fine with the same files and everything o.o

You could try adding :
msgbox @languages[@lang_index]
above the error line and tell me what it says.


EDIT: I just put both of your scripts including the Localization folder into another project and keep getting the same error. What might I be doing wrong? Did you do any changes to your Localization-script since 1.1?
Thank you so much for your patience!

EDIT 2: Okay, got it. Checked your Localizationscript and have seen, that the method is called "Localization.culture" instead of "Localization.language" in the version I've got installed. Should have found that earlier. Working like a charm now, thank you!