From fc17f81c9c9e15ea0a3644daf4c73261fe7da9a1 Mon Sep 17 00:00:00 2001 From: "A.C.M" Date: Sat, 2 May 2020 20:18:55 +0200 Subject: [PATCH] Translation and German Language added. --- armor.lua | 33 ++-- canapa.lua | 4 +- i18n.py | 426 ++++++++++++++++++++++++++++++++++++++++++ init.lua | 46 +++-- locale/cannabis.de.tr | 65 +++++++ locale/template.txt | 65 +++++++ mod.conf | 3 + tools.lua | 42 ++--- 8 files changed, 629 insertions(+), 55 deletions(-) create mode 100755 i18n.py create mode 100644 locale/cannabis.de.tr create mode 100644 locale/template.txt create mode 100644 mod.conf diff --git a/armor.lua b/armor.lua index b56678c..3281ef0 100644 --- a/armor.lua +++ b/armor.lua @@ -1,4 +1,5 @@ - +local S = cannabis.S + --armor if minetest.get_modpath("cannabis") then @@ -16,25 +17,25 @@ } for k, v in pairs(stats) do minetest.register_tool("cannabis:helmet_"..k, { - description = v.name.." Helmet", + description = v.name..S(" Helmet"), inventory_image = "cannabis_armor_inv_helmet_"..k..".png", groups = {armor_head=math.floor(5*v.armor), armor_heal=v.heal, armor_use=v.use}, wear = 0, }) minetest.register_tool("cannabis:chestplate_"..k, { - description = v.name.." Chestplate", + description = v.name..S(" Chestplate"), inventory_image = "cannabis_armor_inv_chestplate_"..k..".png", groups = {armor_torso=math.floor(8*v.armor), armor_heal=v.heal, armor_use=v.use}, wear = 0, }) minetest.register_tool("cannabis:leggings_"..k, { - description = v.name.." Leggings", + description = v.name..S(" Leggings"), inventory_image = "cannabis_armor_inv_leggings_"..k..".png", groups = {armor_legs=math.floor(7*v.armor), armor_heal=v.heal, armor_use=v.use}, wear = 0, }) minetest.register_tool("cannabis:boots_"..k, { - description = v.name.." Boots", + description = v.name..S(" Boots"), inventory_image = "cannabis_armor_inv_boots_"..k..".png", groups = {armor_feet=math.floor(4*v.armor), armor_heal=v.heal, armor_use=v.use}, wear = 0, @@ -77,7 +78,7 @@ if minetest.get_modpath("shields") then for k, v in pairs(stats) do minetest.register_tool("cannabis:shield_"..k, { - description = v.name.." hemp Shield", + description = v.name..S(" Hemp Shield"), inventory_image = "cannabis_armor_inv_shield_"..k..".png", groups = {armor_shield=math.floor(5*v.armor), armor_heal=v.heal, armor_use=v.use}, wear = 0, @@ -96,24 +97,24 @@ end minetest.register_craftitem("cannabis:mixed_hr_ingot", { - description = ("Mixed HR Ingot"), + description = S("Mixed HR Ingot"), inventory_image = "cannabis_mixed_hr_ingot.png", }) minetest.register_craftitem(":cannabis:fibra_ingot", { - description = ("fibra Ingot"), + description = S("Fiber Ingot"), inventory_image = "cannabis_fibra_ingot.png", }) minetest.register_craftitem(":cannabis:foglie_ingot", { - description = ("foglie Ingot"), + description = S("Sheet Ingot"), inventory_image = "cannabis_foglie_ingot.png", }) minetest.register_craftitem("cannabis:high_performance_ingot", { - description = ("High Performance Ingot"), + description = S("High Performance Ingot"), inventory_image = "cannabis_high_performance_ingot.png", }) minetest.register_craftitem(":cannabis:tessuto_ingot", { - description = ("Tessuto Ingot"), + description = S("Textil Ingot"), inventory_image = "cannabis_tessuto_ingot.png", }) local function for_each_registered_item(action) @@ -165,7 +166,7 @@ register_block("cannabis:cannabis_tessuto_block", "cannabis:tessuto_ingot") register_block("cannabis:cannabis_foglie_block", "cannabis:foglie_ingot") minetest.register_node("cannabis:cannabis_foglie_block", { - description = ("Foglie Block"), + description = S("Sheet Block"), tiles = { "cannabis_foglie_block.png" }, is_ground_content = true, groups = {cracky=1, level=2}, @@ -173,7 +174,7 @@ minetest.register_node("cannabis:cannabis_foglie_block", { }) minetest.register_node("cannabis:cannabis_tessuto_block", { - description = ("Tessuto Block"), + description = S("Textil Block"), tiles = { "cannabis_tessuto_block.png" }, is_ground_content = true, groups = {cracky=1, level=2}, @@ -184,7 +185,7 @@ minetest.register_node("cannabis:cannabis_tessuto_block", { minetest.register_node("cannabis:hp_block_canapa", { - description = "hp_block_canapa", + description = S("High Performance Block Canapa"), tiles = {"hp_block_canapa.png"}, is_ground_content = false, groups = {choppy = 30, oddly_breakable_by_hand = 1, flammable = 3, wood = 1}, @@ -193,14 +194,14 @@ minetest.register_node("cannabis:hp_block_canapa", minetest.register_node("cannabis:cannabis_high_performance_block", { - description = ("High Performance Block"), + description = S("High Performance Block"), tiles = { "cannabis_high_performance_block.png" }, is_ground_content = true, groups = {cracky=1, level=2}, sounds = "cannabis_canapa_s3" }) minetest.register_node("cannabis:cannabis_fibra_block", { - description = ("Fibra Block"), + description = S("Fiber Block"), tiles = { "cannabis_fibra_block.png" }, is_ground_content = true, groups = {cracky=1, level=2}, diff --git a/canapa.lua b/canapa.lua index 3a6a674..d48a5ae 100644 --- a/canapa.lua +++ b/canapa.lua @@ -1,8 +1,10 @@ minetest.register_alias("canapa", "cannabis:canapa") --nodes +local S = cannabis.S + minetest.register_node("cannabis:canapa", { - description = "canapa", + description = S("Hemp"), drawtype = "plantlike", tiles = {"cannabis_canapa.png"}, inventory_image = "cannabis_canapa.png", diff --git a/i18n.py b/i18n.py new file mode 100755 index 0000000..5e87937 --- /dev/null +++ b/i18n.py @@ -0,0 +1,426 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate the template file and update the translation files. +# Copy the script into the mod or modpack root folder and run it there. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer +# LGPLv2.1+ +# +# See https://github.com/minetest-tools/update_translations for +# potential future updates to this script. + +from __future__ import print_function +import os, fnmatch, re, shutil, errno +from sys import argv as _argv + +# Running params +params = {"recursive": False, + "help": False, + "mods": False, + "verbose": False, + "folders": [], + "no-old-file": False +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "mods": ['--installed-mods'], + "verbose": ['--verbose', '-v'], + "no-old-file": ['--no-old-file'] +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 60 + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["mods"])} + run on locally installed modules + {', '.join(options["no-old-file"])} + do not create *.old files + {', '.join(options["verbose"])} + add output information +''') + + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + elif params["recursive"] and params["mods"]: + print("Option --installed-mods is incompatible with --recursive") + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if params["mods"]: + print(f"on all locally installed modules in {os.path.abspath('~/.minetest/mods/')}") + run_all_subfolders("~/.minetest/mods") + elif len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_bracketed = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +pattern_tr = re.compile(r'(.+?[^@])=(.*)') +pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') +pattern_tr_filename = re.compile(r'\.tr$') +pattern_po_language_code = re.compile(r'(.*)\.po$') + +#attempt to read the mod's name from the mod.conf file. Returns None on failure +def get_modname(folder): + try: + with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: + for line in mod_conf: + match = pattern_name.match(line) + if match: + return match.group(1) + except FileNotFoundError: + pass + return None + +#If there are already .tr files in /locale, returns a list of their names +def get_existing_tr_files(folder): + out = [] + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + if pattern_tr_filename.search(name): + out.append(name) + return out + +# A series of search and replaces that massage a .po file's contents into +# a .tr file's equivalent +def process_po_file(text): + # The first three items are for unused matches + text = re.sub(r'#~ msgid "', "", text) + text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) + text = re.sub(r'"\n#~ msgstr "', "=", text) + # comment lines + text = re.sub(r'#.*\n', "", text) + # converting msg pairs into "=" pairs + text = re.sub(r'msgid "', "", text) + text = re.sub(r'"\nmsgstr ""\n"', "=", text) + text = re.sub(r'"\nmsgstr "', "=", text) + # various line breaks and escape codes + text = re.sub(r'"\n"', "", text) + text = re.sub(r'"\n', "\n", text) + text = re.sub(r'\\"', '"', text) + text = re.sub(r'\\n', '@n', text) + # remove header text + text = re.sub(r'=Project-Id-Version:.*\n', "", text) + # remove double-spaced lines + text = re.sub(r'\n\n', '\n', text) + return text + +# Go through existing .po files and, if a .tr file for that language +# *doesn't* exist, convert it and create it. +# The .tr file that results will subsequently be reprocessed so +# any "no longer used" strings will be preserved. +# Note that "fuzzy" tags will be lost in this process. +def process_po_files(folder, modname): + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + code_match = pattern_po_language_code.match(name) + if code_match == None: + continue + language_code = code_match.group(1) + tr_name = modname + "." + language_code + ".tr" + tr_file = os.path.join(root, tr_name) + if os.path.exists(tr_file): + if params["verbose"]: + print(f"{tr_name} already exists, ignoring {name}") + continue + fname = os.path.join(root, name) + with open(fname, "r", encoding='utf-8') as po_file: + if params["verbose"]: + print(f"Importing translations from {name}") + text = process_po_file(po_file.read()) + with open(tr_file, "wt", encoding='utf-8') as tr_out: + tr_out.write(text) + +# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 +# Creates a directory if it doesn't exist, silently does +# nothing if it already exists +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name): + lOut = [f"# textdomain: {mod_name}\n"] + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + sourceList.sort() + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + localizedStrings.sort() + lOut.append("") + lOut.append(source) + lOut.append("") + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if len(localizedString) > doublespace_threshold: + lOut.append("") + + + unusedExist = False + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + #TODO remove comments here + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed.findall(text): + strings.append(s) + + for s in strings: + s = re.sub(r'"\.\.\s+"', "", s) + s = re.sub("@[^@=0-9]", "@@", s) + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +def import_tr_file(tr_file): + dOut = {} + text = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + if line[:3] == "###": + # Reset comment block if we hit a header + latest_comment_block = None + continue + if line[:1] == "#": + # Save the comment we're inside + if not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + continue + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + dOut[match.group(1)] = outval + return (dOut, text) + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file sets +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + for root, dirs, files in os.walk(folder): + for name in files: + if fnmatch.fnmatch(name, "*.lua"): + fname = os.path.join(root, name) + found = read_lua_file_strings(fname) + if params["verbose"]: + print(f"{fname}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(f"### {os.path.basename(fname)} ###") + dOut[s] = sources + + if len(dOut) == 0: + return None + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if not params["no-old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + process_po_files(folder, modname) + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print("Unable to find modname in folder " + folder) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir()] + for subfolder in subfolders: + update_mod(subfolder + "/") + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir()]: + update_folder(modfolder + "/") + + +main() diff --git a/init.lua b/init.lua index 68087ca..429bf20 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,19 @@ ---aliases -minetest.get_modpath("cannabis") --minetest.register_alias("canapa","cannabis:canapa") +cannabis = {} + +local S + +if(minetest.get_translator) then + S = minetest.get_translator(minetest.get_current_modname()) + +else + S = function ( s ) return s end + +end + +cannabis.S = S + --tools local path = minetest.get_modpath("cannabis") dofile(path.."/tools.lua") @@ -18,66 +30,66 @@ dofile(path.."/armor.lua") --craft item :fiber, fuel, plastic, paper,flower,oil,flour,bred,raisin,seed,leaves minetest.register_craftitem("cannabis:canapa_fiber", { - description = "Fiber", + description = S("Fiber"), inventory_image = "cannabis_canapa_fiber.png", }) minetest.register_craftitem("cannabis:canapa_fuel", { - description = "Fuel", + description = S("Fuel"), inventory_image = "cannabis_fuel.png", }) minetest.register_craftitem("cannabis:canapa_plastic", { - description = "Plastic", + description = S("Plastic"), inventory_image = "cannabis_plastic.png", }) minetest.register_craftitem("cannabis:canapa_paper", { - description = "Paper", + description = S("Paper"), inventory_image = "cannabis_paper.png", }) minetest.register_craftitem("cannabis:canapa_flour", { - description = "Flour", + description = S("Flour"), inventory_image = "cannabis_canapa_flour.png", }) minetest.register_craftitem("cannabis:canapa_bread", { - description = "Bread", + description = S("Bread"), inventory_image = "cannabis_canapa_bread.png", on_use = minetest.item_eat(10), }) minetest.register_craftitem("cannabis:canapa_seed", { - description = "Hemp_Seed", + description = S("Hemp Seed"), inventory_image = "cannabis_canapa_seed.png", on_use = minetest.item_eat(10), }) minetest.register_craftitem("cannabis:canapa_leaves", { - description = "Hemp_Leaves", + description = S("Hemp Leaves"), inventory_image = "cannabis_canapa_leaves.png", on_use = minetest.item_eat(5), }) minetest.register_craftitem("cannabis:canapa_flower", { - description = "Hemp_Flower", + description = S("Hemp Flower"), inventory_image = "cannabis_canapa_flower.png", on_use = minetest.item_eat(5), }) minetest.register_craftitem("cannabis:canapa_raisin", { - description = "Hemp_Raisin", + description = S("Hemp Raisin"), inventory_image = "cannabis_canapa_raisin.png", on_use = minetest.item_eat(5), }) minetest.register_craftitem("cannabis:canapa_oil", { - description = "Hemp_Oil", + description = S("Hemp Oil"), inventory_image = "cannabis_canapa_oil.png", on_use = minetest.item_eat(5), }) minetest.register_craftitem("cannabis:canapa_glue", { - description = "Hemp_Glue", + description = S("Hemp Glue"), inventory_image = "cannabis_canapa_glue.png", on_use = minetest.item_eat(1), }) @@ -93,7 +105,7 @@ minetest.register_craftitem("cannabis:canapa_glue", { minetest.register_node('cannabis:seedling', { - description = ("hemp (seedling)"), + description = S("Hemp (seedling)"), drawtype = 'plantlike', waving = 1, tiles = { '1hemp_seedling.png' }, @@ -108,7 +120,7 @@ minetest.register_node('cannabis:seedling', { }) minetest.register_node('cannabis:sproutling', { - description = ("hemp (sproutling)"), + description = S("Hemp (sproutling)"), drawtype = 'plantlike', waving = 1, tiles = { 'hemp_sproutling.png' }, @@ -123,7 +135,7 @@ minetest.register_node('cannabis:sproutling', { }) minetest.register_node('cannabis:climbing', { - description = ("hemp (climbing plant)"), + description = S("Hemp (climbing plant)"), drawtype = 'signlike', tiles = { 'hemp_climbing.png' }, inventory_image = 'hemp_climbing.png', diff --git a/locale/cannabis.de.tr b/locale/cannabis.de.tr new file mode 100644 index 0000000..b79c3e5 --- /dev/null +++ b/locale/cannabis.de.tr @@ -0,0 +1,65 @@ +# textdomain: cannabis + + +### armor.lua ### + + Boots= Stiefel + Chestplate= Brustpanzer + Helmet= Helm + Hemp Shield= Hanfschild + Leggings= Hose +Fiber Block=Faserblock +Fiber Ingot=Faserbarren +High Performance Block=Hochwertiger Block +High Performance Block Canapa=Hochwertiger Block Cannabis +High Performance Ingot=Hochwertiger Barren +Mixed HR Ingot=Gemischter HR Barren +Sheet Block=Folienblock +Sheet Ingot=Folienbarren +Textil Block=Stoffblock +Textil Ingot=Stoffbarren + +### canapa.lua ### + +Hemp=Hanf + +### init.lua ### + +Bread=Brot +Fiber=Faser +Flour=Mehl +Fuel=Kraftstoff +Hemp (climbing plant)=Hanf (kletternde Pflanze) +Hemp (seedling)=Hanf (Sämling) +Hemp (sproutling)=Hanf (Sprießend) +Hemp Flower=Hanfblume +Hemp Glue=Hanfkleber +Hemp Leaves=Hanfblätter +Hemp Oil=Hanföl +Hemp Raisin=Hanfrosine +Hemp Seed=Hanfsamen +Paper=Papier +Plastic=Plastik + +### tools.lua ### + +Hemp Bronze Axe= Hanf Bronze Axt +Hemp Bronze Pickaxe=Hanf Bronze Spitzhacke +Hemp Bronze Shovel=Hanf Bronze Schaufel +Hemp Bronze Sword=Hanf Bronze Schaufel +Hemp Diamond Axe=Hanf Diamant Axt +Hemp Diamond Pickaxe=Hanf Diamant Spitzhacke +Hemp Diamond Shovel=Hanf Diamant Schaufel +Hemp Diamond Sword=Hanf Diamant Schwert +Hemp High Performance Axe=Hanf Hochwertige Axt +Hemp High Performance Sword=Hanf Hochwertiges Schwert +Hemp Mese Axe=Hanf Mese Axt +Hemp Mese Pickaxe=Hanf Mese Spitzhacke +Hemp Mese Shovel=Hanf Mese Schaufel +Hemp Mese Sword=Hanf Mese Schwert +Hemp Pickaxe=Hanf Spitzhacke +Hemp Shovel=Hanf Schaufel +Hemp Steel Axe=Hanf Eisen Axt +Hemp Steel Pickaxe=Hanf Eisen Spitzhacke +Hemp Steel Shovel=Hanf Eisen Schaufel +Hemp Steel Sword=Hanf Eisen Schwert diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..df70e4a --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,65 @@ +# textdomain: cannabis + + +### armor.lua ### + + Boots= + Chestplate= + Helmet= + Hemp Shield= + Leggings= +Fiber Block= +Fiber Ingot= +High Performance Block= +High Performance Block Canapa= +High Performance Ingot= +Mixed HR Ingot= +Sheet Block= +Sheet Ingot= +Textil Block= +Textil Ingot= + +### canapa.lua ### + +Hemp= + +### init.lua ### + +Bread= +Fiber= +Flour= +Fuel= +Hemp (climbing plant)= +Hemp (seedling)= +Hemp (sproutling)= +Hemp Flower= +Hemp Glue= +Hemp Leaves= +Hemp Oil= +Hemp Raisin= +Hemp Seed= +Paper= +Plastic= + +### tools.lua ### + +Hemp Bronze Axe= +Hemp Bronze Pickaxe= +Hemp Bronze Shovel= +Hemp Bronze Sword= +Hemp Diamond Axe= +Hemp Diamond Pickaxe= +Hemp Diamond Shovel= +Hemp Diamond Sword= +Hemp High Performance Axe= +Hemp High Performance Sword= +Hemp Mese Axe= +Hemp Mese Pickaxe= +Hemp Mese Shovel= +Hemp Mese Sword= +Hemp Pickaxe= +Hemp Shovel= +Hemp Steel Axe= +Hemp Steel Pickaxe= +Hemp Steel Shovel= +Hemp Steel Sword= diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..13a4da4 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = cannabis +depends = default +optional_default = 3d_armor diff --git a/tools.lua b/tools.lua index 3f9c263..d147549 100644 --- a/tools.lua +++ b/tools.lua @@ -4,10 +4,10 @@ -- -- Picks______________________________________________________________________________ -- - +local S = cannabis.S minetest.register_tool("cannabis:pick_hemp_steel", { - description = "HSteel Pickaxe", + description = S("Hemp Steel Pickaxe"), inventory_image = "cannabis_tool_steelpick.png", tool_capabilities = { full_punch_interval = 1.0, @@ -19,7 +19,7 @@ minetest.register_tool("cannabis:pick_hemp_steel", { }, }) minetest.register_tool("cannabis:pick_hemp_bronze", { - description = "HBronze Pickaxe", + description = S("Hemp Bronze Pickaxe"), inventory_image = "cannabis_tool_bronzepick.png", tool_capabilities = { full_punch_interval = 1.0, @@ -31,7 +31,7 @@ minetest.register_tool("cannabis:pick_hemp_bronze", { }, }) minetest.register_tool("cannabis:pick_hemp_mese", { - description = "HMese Pickaxe", + description = S("Hemp Mese Pickaxe"), inventory_image = "cannabis_tool_mesepick.png", tool_capabilities = { full_punch_interval = 0.9, @@ -43,7 +43,7 @@ minetest.register_tool("cannabis:pick_hemp_mese", { }, }) minetest.register_tool("cannabis:pick_hemp_diamond", { - description = "HDiamond Pickaxe", + description = S("Hemp Diamond Pickaxe"), inventory_image = "cannabis_tool_diamondpick.png", tool_capabilities = { full_punch_interval = 0.9, @@ -55,7 +55,7 @@ minetest.register_tool("cannabis:pick_hemp_diamond", { }, }) minetest.register_tool("cannabis:pick_hemp_high", { - description = "Hemp_high Pickaxe", + description = S("Hemp Pickaxe"), inventory_image = "cannabis_tool_highpick.png", tool_capabilities = { full_punch_interval = 0.9, @@ -71,7 +71,7 @@ minetest.register_tool("cannabis:pick_hemp_high", { -- minetest.register_tool("cannabis:shovel_hemp_high", { - description = "Hemp_high Shovel", + description = S("Hemp Shovel"), inventory_image = "cannabis_tool_highshovel.png", wield_image = "cannabis_tool_highshovel.png^[transformR90", tool_capabilities = { @@ -85,7 +85,7 @@ minetest.register_tool("cannabis:shovel_hemp_high", { }) minetest.register_tool("cannabis:shovel_hemp_steel", { - description = "HSteel Shovel", + description = S("Hemp Steel Shovel"), inventory_image = "cannabis_tool_steelshovel.png", wield_image = "cannabis_tool_steelshovel.png^[transformR90", tool_capabilities = { @@ -98,7 +98,7 @@ minetest.register_tool("cannabis:shovel_hemp_steel", { }, }) minetest.register_tool("cannabis:shovel_hemp_bronze", { - description = "HBronze Shovel", + description = S("Hemp Bronze Shovel"), inventory_image = "cannabis_tool_bronzeshovel.png", wield_image = "cannabis_tool_bronzeshovel.png^[transformR90", tool_capabilities = { @@ -111,7 +111,7 @@ minetest.register_tool("cannabis:shovel_hemp_bronze", { }, }) minetest.register_tool("cannabis:shovel_hemp_mese", { - description = "HMese Shovel", + description = S("Hemp Mese Shovel"), inventory_image = "cannabis_tool_meseshovel.png", wield_image = "cannabis_tool_meseshovel.png^[transformR90", tool_capabilities = { @@ -124,7 +124,7 @@ minetest.register_tool("cannabis:shovel_hemp_mese", { }, }) minetest.register_tool("cannabis:shovel_hemp_diamond", { - description = "HDiamond Shovel", + description = S("Hemp Diamond Shovel"), inventory_image = "cannabis_tool_diamondshovel.png", wield_image = "cannabis_tool_diamondshovel.png^[transformR90", tool_capabilities = { @@ -157,7 +157,7 @@ minetest.register_tool("cannabis:shovel_hemp_diamond", { -- Axes____________________________________________________________________________________________________ -- minetest.register_tool("cannabis:axe_hemp_steel", { - description = "HSteel Axe", + description = S("Hemp Steel Axe"), inventory_image = "cannabis_tool_steelaxe.png", tool_capabilities = { full_punch_interval = 1.0, @@ -169,7 +169,7 @@ minetest.register_tool("cannabis:axe_hemp_steel", { }, }) minetest.register_tool("cannabis:axe_hemp_bronze", { - description = "HBronze Axe", + description = S("Hemp Bronze Axe"), inventory_image = "cannabis_tool_bronzeaxe.png", tool_capabilities = { full_punch_interval = 1.0, @@ -181,7 +181,7 @@ minetest.register_tool("cannabis:axe_hemp_bronze", { }, }) minetest.register_tool("cannabis:axe_hemp_mese", { - description = "HMese Axe", + description = S("Hemp Mese Axe"), inventory_image = "cannabis_tool_meseaxe.png", tool_capabilities = { full_punch_interval = 0.9, @@ -193,7 +193,7 @@ minetest.register_tool("cannabis:axe_hemp_mese", { }, }) minetest.register_tool("cannabis:axe_hemp_diamond", { - description = "HDiamond Axe", + description = S("Hemp Diamond Axe"), inventory_image = "cannabis_tool_diamondaxe.png", tool_capabilities = { full_punch_interval = 0.9, @@ -205,7 +205,7 @@ minetest.register_tool("cannabis:axe_hemp_diamond", { }, }) minetest.register_tool("cannabis:axe_hemp_high", { - description = "Hemp_high Axe", + description = S("Hemp High Performance Axe"), inventory_image = "cannabis_tool_highaxe.png", tool_capabilities = { full_punch_interval = 0.9, @@ -220,7 +220,7 @@ minetest.register_tool("cannabis:axe_hemp_high", { -- Swords___________________________________________________________________________________________________ minetest.register_tool("cannabis:sword_hemp_steel", { - description = "HSteel Sword", + description = S("Hemp Steel Sword"), inventory_image = "cannabis_tool_steelsword.png", tool_capabilities = { full_punch_interval = 0.8, @@ -232,7 +232,7 @@ minetest.register_tool("cannabis:sword_hemp_steel", { } }) minetest.register_tool("cannabis:sword_hemp_bronze", { - description = "HBronze Sword", + description = S("Hemp Bronze Sword"), inventory_image = "cannabis_tool_bronzesword.png", tool_capabilities = { full_punch_interval = 0.8, @@ -244,7 +244,7 @@ minetest.register_tool("cannabis:sword_hemp_bronze", { } }) minetest.register_tool("cannabis:sword_hemp_mese", { - description = "HMese Sword", + description = S("Hemp Mese Sword"), inventory_image = "cannabis_tool_mesesword.png", tool_capabilities = { full_punch_interval = 0.7, @@ -256,7 +256,7 @@ minetest.register_tool("cannabis:sword_hemp_mese", { } }) minetest.register_tool("cannabis:sword_hemp_diamond", { - description = "HDiamond Sword", + description = S("Hemp Diamond Sword"), inventory_image = "cannabis_tool_diamondsword.png", tool_capabilities = { full_punch_interval = 0.7, @@ -268,7 +268,7 @@ minetest.register_tool("cannabis:sword_hemp_diamond", { } }) minetest.register_tool("cannabis:sword_hemp_high", { - description = "Hemp_high Sword", + description = S("Hemp High Performance Sword"), inventory_image = "cannabis_tool_highsword.png", tool_capabilities = { full_punch_interval = 0.7,