add i18n script, update translation files

This commit is contained in:
FaceDeer 2020-03-02 20:31:29 -07:00
parent 75e2bdb934
commit 6525e577fb
6 changed files with 597 additions and 105 deletions

421
i18n.py Normal file

@ -0,0 +1,421 @@
#!/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": []
}
# Available CLI options
options = {"recursive": ['--recursive', '-r'],
"help": ['--help', '-h'],
"mods": ['--installed-mods'],
"verbose": ['--verbose', '-v']
}
# 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["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.")
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()

@ -58,4 +58,4 @@ if minetest.get_modpath("lucky_block") then
})
end
print (S("[MOD] Hopper loaded"))
minetest.log("action", "[hopper] Hopper mod loaded")

@ -1,34 +1,57 @@
# textdomain: hopper
# Internationalization template for Hopper mod.
# Copyright (C) 2017
# This file is distributed under the same license as the PACKAGE package.
# FaceDeer
Hopper to transfer items between neighboring blocks' inventories.=
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=
A chute to transfer items over longer distances.=
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=
A sorter to redirect certain items to an alternate target.=
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=
[MOD] Hopper loaded=[MOD] Trichter geladen
Don't@nEject=
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=
Eject@nItems=
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=
Hopper Chute=
### chute.lua ###
@1 moves stuff to chute at @2=@1 verlagert Dinge in einen Trichter bei @2
Hopper=Trichter
Hopper Chute=
### doc.lua ###
A chute to transfer items over longer distances.=
A sorter to redirect certain items to an alternate target.=
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=
Hopper to transfer items between neighboring blocks' inventories.=
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=
### hoppers.lua ###
@1 moves stuff from hopper at @2=@1 nimmt Dinge aus einem Trichter bei @2
@1 moves stuff in hopper at @2=@1 bewegt Dinge in einem Trichter bei @2
@1 moves stuff to hopper at @2=@1 verlagert Dinge in einen Trichter bei @2
@1 moves stuff from hopper at @2=@1 nimmt Dinge aus einem Trichter bei @2
Hopper=Trichter
Side Hopper=Seitentrichter
Selective@nFilter=
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=
### sorter.lua ###
@1 moves stuff to sorter at @2=@1 verlagert Dinge in einen Trichter bei @2
Filter=
Filter@nAll=
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=
Selective@nFilter=
Sorter=
@1 moves stuff to sorter at @2=@1 verlagert Dinge in einen Trichter bei @2
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=
### utility.lua ###
Don't@nEject=
Eject@nItems=
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=

@ -1,32 +1,58 @@
# textdomain: hopper
# Lunovox Heavenfinder <lunovox@disroot.org>
### chute.lua ###
# translation by Lunovox Heavenfinder <lunovox@disroot.org>
@1 moves stuff to chute at @2=@1 moveu coisas para calha em @2
Hopper Chute=Calha de Funil
### doc.lua ###
A chute to transfer items over longer distances.=Um chute para transferir itens por longas distâncias.
A sorter to redirect certain items to an alternate target.=Um classificador para redirecionar determinados itens para um destino alternativo.
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=As calhas funcionam muito bem como tremonhas, mas não possuem sua própria capacidade de admissão. Os itens só podem ser inseridos em um chute manualmente ou por um funil conectado a um chute. Eles transferem itens na direção indicada pela seta em seu segmento estreito a uma taxa de um item por segundo. Eles têm uma capacidade de buffer de memória pequena e todos os itens que não podem ser colocados no inventário do bloco de destino permanecerão alojados no buffer de memória do chute até que sejam removidos manualmente ou seu destino esteja disponível.
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=Os blocos do funil vêm em formulários "verticais" e "laterais", mas quando no inventário de um jogador ambos são representados por um único item genérico. O tipo de bloco funil que será colocado quando o jogador usa este item depende do que está apontado - quando o item funil é apontado na face superior ou inferior de um bloco, um funil vertical é colocado, quando apontado para o lado de um bloquear um funil lateral é produzido que se conecta ao lado clicado.@n@n
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=Os blocos do funil vêm nas formas 'vertical' e 'lateral'. Eles podem ser interconvertidos entre as duas formas através da grade de criação.@n@n
Hopper to transfer items between neighboring blocks' inventories.=Funil para transferir itens entre os inventários dos blocos vizinhos.
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=Os itens são transferidos do bloco na extremidade larga da tremonha para o bloco na extremidade estreita da tremonha a uma taxa de um por segundo. Os itens também podem ser colocados diretamente no estoque do funil, ou podem ser colocados no espaço acima de um funil e serão sugados para o inventário do funil automaticamente.@n@n
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=Os blocos do funil vêm em formulários "verticais" e "laterais", mas quando no inventário de um jogador ambos são representados por um único item genérico. O tipo de bloco funil que será colocado quando o jogador usa este item depende do que está apontado - quando o item funil é apontado na face superior ou inferior de um bloco, um funil vertical é colocado, quando apontado para o lado de um bloquear um funil lateral é produzido que se conecta ao lado clicado.@n@n
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=Os blocos do funil vêm nas formas 'vertical' e 'lateral'. Eles podem ser interconvertidos entre as duas formas através da grade de criação.@n@n
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=Quando usados com fornos, os funis injetam itens na fenda de estoque de "matéria-prima" do forno quando a extremidade estreita é presa à parte superior ou inferior e injetam itens na ranhura de estoque "combustível" do forno quando fixados ao lado do forno.@n@nItens que não podem ser colocados no inventário de um bloco de destino permanecerão no depósito.@n@nOs funis têm as mesmas permissões que o jogador que os colocou. Os funis colocados por você podem pegar itens ou colocar itens em caixas bloqueadas que você possui, mas os funis colocados por outros jogadores não poderão fazê-lo. No entanto, o inventário próprio de um depósito não é bloqueado pelo proprietário, portanto você pode usar isso como uma forma de permitir que outros jogadores depositem itens em seus baús bloqueados.
A chute to transfer items over longer distances.=Um chute para transferir itens por longas distâncias.
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=As calhas funcionam muito bem como tremonhas, mas não possuem sua própria capacidade de admissão. Os itens só podem ser inseridos em um chute manualmente ou por um funil conectado a um chute. Eles transferem itens na direção indicada pela seta em seu segmento estreito a uma taxa de um item por segundo. Eles têm uma capacidade de buffer de memória pequena e todos os itens que não podem ser colocados no inventário do bloco de destino permanecerão alojados no buffer de memória do chute até que sejam removidos manualmente ou seu destino esteja disponível.
A sorter to redirect certain items to an alternate target.=Um classificador para redirecionar determinados itens para um destino alternativo.
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=Isso é semelhante a um chute, mas tem uma saída secundária usada para desviar itens específicos para um destino alternativo. Há um conjunto de espaços de inventário rotulados como "Filtro" na parte superior da tela de inventário do bloco, se você colocar um item em um desses slots, o classificador registrará o tipo do item (sem realmente tirá-lo de você). Em seguida, quando os itens passarem pelo inventário do classificador que corresponde a um dos itens da lista de filtros, ele primeiro tentará enviá-lo na direção marcada com uma seta nos lados do classificador.@n@nSe o item não corresponder à lista de filtros ou se a saída secundária não puder receber o item por qualquer motivo, o classificador tentará enviar o item para a outra saída.@n@nAlém disso, há um botão chamado "Filtrar tudo" que informa ao classificador para não usar a lista de filtros e tentar primeiro desviar todos os itens para fora do filtro, enviando apenas itens ao longo do caminho sem filtro se o destino não puder aceitar por qualquer motivo. Esse recurso é útil para manipular "estouro" (quando o estoque do alvo é preenchido) ou para lidar com destinos que são seletivos sobre o que eles aceitam (por exemplo, o compartimento de combustível de um forno).
[MOD] Hopper loaded=[Hopper] Carregado com sucesso!
Don't@nEject=Não@nEjetar
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=Este alimentador está atualmente configurado para ejetar itens de sua saída, mesmo se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para desativar esse recurso.
Eject@nItems=Ejetar@nItens
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=Este funil está atualmente configurado para segurar o item se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para ejetar itens.
Hopper Chute=Calha de Funil
@1 moves stuff to chute at @2=@1 moveu coisas para calha em @2
Hopper=Funil
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=Quando usados com fornos, os funis injetam itens na fenda de estoque de "matéria-prima" do forno quando a extremidade estreita é presa à parte superior ou inferior e injetam itens na ranhura de estoque "combustível" do forno quando fixados ao lado do forno.@n@nItens que não podem ser colocados no inventário de um bloco de destino permanecerão no depósito.@n@nOs funis têm as mesmas permissões que o jogador que os colocou. Os funis colocados por você podem pegar itens ou colocar itens em caixas bloqueadas que você possui, mas os funis colocados por outros jogadores não poderão fazê-lo. No entanto, o inventário próprio de um depósito não é bloqueado pelo proprietário, portanto você pode usar isso como uma forma de permitir que outros jogadores depositem itens em seus baús bloqueados.
### hoppers.lua ###
@1 moves stuff from hopper at @2=@1 move as coisas do funil para @2
@1 moves stuff in hopper at @2=@1 moveu coisas no funil em @2
@1 moves stuff to hopper at @2=@1 moveu as coisas para o funil em @2
@1 moves stuff from hopper at @2=@1 move as coisas do funil para @2
Hopper=Funil
Side Hopper=Funil Lateral
Selective@nFilter=Filtro@nSeletivo
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=Este separador está atualmente configurado para tentar enviar todos os itens na direção da seta. Clique neste botão para ativar um filtro específico para um tipo de item.
### sorter.lua ###
@1 moves stuff to sorter at @2=@1 move coisas para classificador em @2
Filter=Filtro
Filter@nAll=Filtrar@nTudo
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=Este separador está atualmente configurado para enviar apenas itens listados na lista de filtros na direção da seta. Clique neste botão para configurá-lo para tentar enviar todos os itens dessa maneira primeiro.
Selective@nFilter=Filtro@nSeletivo
Sorter=Organizador
@1 moves stuff to sorter at @2=@1 move coisas para classificador em @2
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=Este separador está atualmente configurado para enviar apenas itens listados na lista de filtros na direção da seta. Clique neste botão para configurá-lo para tentar enviar todos os itens dessa maneira primeiro.
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=Este separador está atualmente configurado para tentar enviar todos os itens na direção da seta. Clique neste botão para ativar um filtro específico para um tipo de item.
### utility.lua ###
Don't@nEject=Não@nEjetar
Eject@nItems=Ejetar@nItens
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=Este alimentador está atualmente configurado para ejetar itens de sua saída, mesmo se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para desativar esse recurso.
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=Este funil está atualmente configurado para segurar o item se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para ejetar itens.

@ -1,31 +1,58 @@
# textdomain: hopper
# Lunovox Heavenfinder <lunovox@disroot.org>
Hopper to transfer items between neighboring blocks' inventories.=Funil para transferir itens entre os inventários dos blocos vizinhos.
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=Os itens são transferidos do bloco na extremidade larga da tremonha para o bloco na extremidade estreita da tremonha a uma taxa de um por segundo. Os itens também podem ser colocados diretamente no estoque do funil, ou podem ser colocados no espaço acima de um funil e serão sugados para o inventário do funil automaticamente.@n@n
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=Os blocos do funil vêm em formulários "verticais" e "laterais", mas quando no inventário de um jogador ambos são representados por um único item genérico. O tipo de bloco funil que será colocado quando o jogador usa este item depende do que está apontado - quando o item funil é apontado na face superior ou inferior de um bloco, um funil vertical é colocado, quando apontado para o lado de um bloquear um funil lateral é produzido que se conecta ao lado clicado.@n@n
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=Os blocos do funil vêm nas formas 'vertical' e 'lateral'. Eles podem ser interconvertidos entre as duas formas através da grade de criação.@n@n
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=Quando usados com fornos, os funis injetam itens na fenda de estoque de "matéria-prima" do forno quando a extremidade estreita é presa à parte superior ou inferior e injetam itens na ranhura de estoque "combustível" do forno quando fixados ao lado do forno.@n@nItens que não podem ser colocados no inventário de um bloco de destino permanecerão no depósito.@n@nOs funis têm as mesmas permissões que o jogador que os colocou. Os funis colocados por você podem pegar itens ou colocar itens em caixas bloqueadas que você possui, mas os funis colocados por outros jogadores não poderão fazê-lo. No entanto, o inventário próprio de um depósito não é bloqueado pelo proprietário, portanto você pode usar isso como uma forma de permitir que outros jogadores depositem itens em seus baús bloqueados.
A chute to transfer items over longer distances.=Um chute para transferir itens por longas distâncias.
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=As calhas funcionam muito bem como tremonhas, mas não possuem sua própria capacidade de admissão. Os itens só podem ser inseridos em um chute manualmente ou por um funil conectado a um chute. Eles transferem itens na direção indicada pela seta em seu segmento estreito a uma taxa de um item por segundo. Eles têm uma capacidade de buffer de memória pequena e todos os itens que não podem ser colocados no inventário do bloco de destino permanecerão alojados no buffer de memória do chute até que sejam removidos manualmente ou seu destino esteja disponível.
A sorter to redirect certain items to an alternate target.=Um classificador para redirecionar determinados itens para um destino alternativo.
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=Isso é semelhante a um chute, mas tem uma saída secundária usada para desviar itens específicos para um destino alternativo. Há um conjunto de espaços de inventário rotulados como "Filtro" na parte superior da tela de inventário do bloco, se você colocar um item em um desses slots, o classificador registrará o tipo do item (sem realmente tirá-lo de você). Em seguida, quando os itens passarem pelo inventário do classificador que corresponde a um dos itens da lista de filtros, ele primeiro tentará enviá-lo na direção marcada com uma seta nos lados do classificador.@n@nSe o item não corresponder à lista de filtros ou se a saída secundária não puder receber o item por qualquer motivo, o classificador tentará enviar o item para a outra saída.@n@nAlém disso, há um botão chamado "Filtrar tudo" que informa ao classificador para não usar a lista de filtros e tentar primeiro desviar todos os itens para fora do filtro, enviando apenas itens ao longo do caminho sem filtro se o destino não puder aceitar por qualquer motivo. Esse recurso é útil para manipular "estouro" (quando o estoque do alvo é preenchido) ou para lidar com destinos que são seletivos sobre o que eles aceitam (por exemplo, o compartimento de combustível de um forno).
[MOD] Hopper loaded=[Hopper] Carregado com sucesso!
Don't@nEject=Não@nEjetar
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=Este alimentador está atualmente configurado para ejetar itens de sua saída, mesmo se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para desativar esse recurso.
Eject@nItems=Ejetar@nItens
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=Este funil está atualmente configurado para segurar o item se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para ejetar itens.
Hopper Chute=Calha de Funil
### chute.lua ###
# Translation by Lunovox Heavenfinder <lunovox@disroot.org>
@1 moves stuff to chute at @2=@1 moveu coisas para calha em @2
Hopper=Funil
Hopper Chute=Calha de Funil
### doc.lua ###
A chute to transfer items over longer distances.=Um chute para transferir itens por longas distâncias.
A sorter to redirect certain items to an alternate target.=Um classificador para redirecionar determinados itens para um destino alternativo.
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=As calhas funcionam muito bem como tremonhas, mas não possuem sua própria capacidade de admissão. Os itens só podem ser inseridos em um chute manualmente ou por um funil conectado a um chute. Eles transferem itens na direção indicada pela seta em seu segmento estreito a uma taxa de um item por segundo. Eles têm uma capacidade de buffer de memória pequena e todos os itens que não podem ser colocados no inventário do bloco de destino permanecerão alojados no buffer de memória do chute até que sejam removidos manualmente ou seu destino esteja disponível.
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=Os blocos do funil vêm em formulários "verticais" e "laterais", mas quando no inventário de um jogador ambos são representados por um único item genérico. O tipo de bloco funil que será colocado quando o jogador usa este item depende do que está apontado - quando o item funil é apontado na face superior ou inferior de um bloco, um funil vertical é colocado, quando apontado para o lado de um bloquear um funil lateral é produzido que se conecta ao lado clicado.@n@n
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=Os blocos do funil vêm nas formas 'vertical' e 'lateral'. Eles podem ser interconvertidos entre as duas formas através da grade de criação.@n@n
Hopper to transfer items between neighboring blocks' inventories.=Funil para transferir itens entre os inventários dos blocos vizinhos.
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=Os itens são transferidos do bloco na extremidade larga da tremonha para o bloco na extremidade estreita da tremonha a uma taxa de um por segundo. Os itens também podem ser colocados diretamente no estoque do funil, ou podem ser colocados no espaço acima de um funil e serão sugados para o inventário do funil automaticamente.@n@n
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=Isso é semelhante a um chute, mas tem uma saída secundária usada para desviar itens específicos para um destino alternativo. Há um conjunto de espaços de inventário rotulados como "Filtro" na parte superior da tela de inventário do bloco, se você colocar um item em um desses slots, o classificador registrará o tipo do item (sem realmente tirá-lo de você). Em seguida, quando os itens passarem pelo inventário do classificador que corresponde a um dos itens da lista de filtros, ele primeiro tentará enviá-lo na direção marcada com uma seta nos lados do classificador.@n@nSe o item não corresponder à lista de filtros ou se a saída secundária não puder receber o item por qualquer motivo, o classificador tentará enviar o item para a outra saída.@n@nAlém disso, há um botão chamado "Filtrar tudo" que informa ao classificador para não usar a lista de filtros e tentar primeiro desviar todos os itens para fora do filtro, enviando apenas itens ao longo do caminho sem filtro se o destino não puder aceitar por qualquer motivo. Esse recurso é útil para manipular "estouro" (quando o estoque do alvo é preenchido) ou para lidar com destinos que são seletivos sobre o que eles aceitam (por exemplo, o compartimento de combustível de um forno).
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=Quando usados com fornos, os funis injetam itens na fenda de estoque de "matéria-prima" do forno quando a extremidade estreita é presa à parte superior ou inferior e injetam itens na ranhura de estoque "combustível" do forno quando fixados ao lado do forno.@n@nItens que não podem ser colocados no inventário de um bloco de destino permanecerão no depósito.@n@nOs funis têm as mesmas permissões que o jogador que os colocou. Os funis colocados por você podem pegar itens ou colocar itens em caixas bloqueadas que você possui, mas os funis colocados por outros jogadores não poderão fazê-lo. No entanto, o inventário próprio de um depósito não é bloqueado pelo proprietário, portanto você pode usar isso como uma forma de permitir que outros jogadores depositem itens em seus baús bloqueados.
### hoppers.lua ###
@1 moves stuff from hopper at @2=@1 move as coisas do funil para @2
@1 moves stuff in hopper at @2=@1 moveu coisas no funil em @2
@1 moves stuff to hopper at @2=@1 moveu as coisas para o funil em @2
@1 moves stuff from hopper at @2=@1 move as coisas do funil para @2
Hopper=Funil
Side Hopper=Funil Lateral
Selective@nFilter=Filtro@nSeletivo
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=Este separador está atualmente configurado para tentar enviar todos os itens na direção da seta. Clique neste botão para ativar um filtro específico para um tipo de item.
### sorter.lua ###
@1 moves stuff to sorter at @2=@1 move coisas para classificador em @2
Filter=Filtro
Filter@nAll=Filtrar@nTudo
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=Este separador está atualmente configurado para enviar apenas itens listados na lista de filtros na direção da seta. Clique neste botão para configurá-lo para tentar enviar todos os itens dessa maneira primeiro.
Selective@nFilter=Filtro@nSeletivo
Sorter=Organizador
@1 moves stuff to sorter at @2=@1 move coisas para classificador em @2
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=Este separador está atualmente configurado para enviar apenas itens listados na lista de filtros na direção da seta. Clique neste botão para configurá-lo para tentar enviar todos os itens dessa maneira primeiro.
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=Este separador está atualmente configurado para tentar enviar todos os itens na direção da seta. Clique neste botão para ativar um filtro específico para um tipo de item.
### utility.lua ###
Don't@nEject=Não@nEjetar
Eject@nItems=Ejetar@nItens
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=Este alimentador está atualmente configurado para ejetar itens de sua saída, mesmo se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para desativar esse recurso.
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=Este funil está atualmente configurado para segurar o item se não houver um bloco compatível posicionado para recebê-lo. Clique neste botão para ejetar itens.

@ -1,63 +1,58 @@
# textdomain: hopper
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Hopper to transfer items between neighboring blocks' inventories.=
### chute.lua ###
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=
@1 moves stuff to chute at @2=
Hopper Chute=
### doc.lua ###
A chute to transfer items over longer distances.=
A sorter to redirect certain items to an alternate target.=
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=
Hopper blocks come in both 'vertical' and 'side' forms, but when in a player's inventory both are represented by a single generic item. The type of hopper block that will be placed when the player uses this item depends on what is pointed at - when the hopper item is pointed at the top or bottom face of a block a vertical hopper is placed, when aimed at the side of a block a side hopper is produced that connects to the clicked-on side.@n@n=
Hopper blocks come in both 'vertical' and 'side' forms. They can be interconverted between the two forms via the crafting grid.@n@n=
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=
Hopper to transfer items between neighboring blocks' inventories.=
A chute to transfer items over longer distances.=
Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.=
A sorter to redirect certain items to an alternate target.=
Items are transfered from the block at the wide end of the hopper to the block at the narrow end of the hopper at a rate of one per second. Items can also be placed directly into the hopper's inventory, or they can be dropped into the space above a hopper and will be sucked into the hopper's inventory automatically.@n@n=
This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled "Filter" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.@n@nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.@n@nIn addition, there is a button labeled "Filter All" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling "overflow" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).=
[MOD] Hopper loaded=
When used with furnaces, hoppers inject items into the furnace's "raw material" inventory slot when the narrow end is attached to the top or bottom and inject items into the furnace's "fuel" inventory slot when attached to the furnace's side.@n@nItems that cannot be placed in a target block's inventory will remain in the hopper.@n@nHoppers have the same permissions as the player that placed them. Hoppers placed by you are allowed to take items from or put items into locked chests that you own, but hoppers placed by other players will be unable to do so. A hopper's own inventory is not not owner-locked, though, so you can use this as a way to allow other players to deposit items into your locked chests.=
Don't@nEject=
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=
Eject@nItems=
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=
Hopper Chute=
@1 moves stuff to chute at @2=
Hopper=
@1 moves stuff in hopper at @2=
@1 moves stuff to hopper at @2=
### hoppers.lua ###
@1 moves stuff from hopper at @2=
@1 moves stuff in hopper at @2=
@1 moves stuff to hopper at @2=
Hopper=
Side Hopper=
Selective@nFilter=
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=
### sorter.lua ###
@1 moves stuff to sorter at @2=
Filter=
Filter@nAll=
Selective@nFilter=
Sorter=
This sorter is currently set to only send items listed@nin the filter list in the direction of the arrow.@nClick this button to set it to try sending all@nitems that way first.=
Sorter=
This sorter is currently set to try sending all items@nin the direction of the arrow. Click this button@nto enable an item-type-specific filter.=
### utility.lua ###
Don't@nEject=
Eject@nItems=
This hopper is currently set to eject items from its output@neven if there isn't a compatible block positioned to receive it.@nClick this button to disable this feature.=
This hopper is currently set to hold on to item if there@nisn't a compatible block positioned to receive it.@nClick this button to have it eject items instead.=
@1 moves stuff to sorter at @2=