Revision eb6e0359
Added by Marc Dequènes over 14 years ago
- ID eb6e0359e66f7e92e69b30eaa3795818d2e29ab0
bin/postman | ||
---|---|---|
#require 'socket'
|
||
require 'tempfile'
|
||
require 'shellwords'
|
||
require 'cyborghood/language'
|
||
require 'cyborghood/imap'
|
||
require 'cyborghood/mail'
|
||
require 'cyborghood/mail_order'
|
||
... | ... | |
|
||
module CyborgHood
|
||
module PostmanHome
|
||
include GetText
|
||
include CHTranslation
|
||
bindtextdomain("cyborghood_postman", {:path => Config::L10N_DIR, :charset => "UTF-8"})
|
||
|
||
# not yet ready to be a real Cyborg
|
||
class Postman #< Cyborg
|
||
include GetText
|
||
include CHTranslation
|
||
|
||
def initialize
|
||
# load config
|
||
... | ... | |
end
|
||
end
|
||
result_tag = report.ok? ? "SUCCESS" : "FAILURE"
|
||
logger.info "Processing result: #{result_tag} (#{report.error})"
|
||
result_msg = "Processing result: #{result_tag}"
|
||
result_msg += " (#{report.error.untranslated})" unless report.ok?
|
||
logger.info result_msg
|
||
|
||
i18n = I18n.instance
|
||
i18n.set_language_for_user(report.user)
|
||
... | ... | |
unless report.ok?
|
||
if report.warn_sender
|
||
logger.info "Sending reply for rejected message"
|
||
intro = report.user ? sprintf(_("Hello %s,"), report.user.cn) : _("Hello,")
|
||
mail_reply = mail.create_simple_reject_reply(intro + "\n\n" + sprintf(
|
||
_("A message (ID: %s), apparently from you, was rejected for the following reason:"),
|
||
mail.message_id) + "\n " + _(report.error) + "\n" + mail_signature())
|
||
reply_intro = report.user ? _("Hello %{cn},", :cn =>report.user.cn) : _("Hello,")
|
||
mail_reply = mail.create_simple_reject_reply(reply_intro.to_s + "\n\n" +
|
||
_("A message (ID: %{id}), apparently from you, was rejected for the following reason:",
|
||
:id => mail.message_id).to_s + "\n " + report.error.to_s + "\n" + mail_signature())
|
||
mail_reply.deliver
|
||
end
|
||
msg.delete
|
||
... | ... | |
|
||
order = MailOrder.parse(report.user, report.message)
|
||
result_tag = order.valid? ? "SUCCESS" : "FAILURE"
|
||
logger.info "Processing result: #{result_tag} (#{order.error})"
|
||
result_msg = "Processing result: #{result_tag}"
|
||
result_msg += " (#{order.error.untranslated})" unless order.valid?
|
||
logger.info result_msg
|
||
|
||
reply_intro = _("Hello %{cn},", :cn => order.user.cn)
|
||
|
||
unless order.valid?
|
||
logger.info "Sending reply for rejected order"
|
||
mail_reply = mail.create_simple_reject_reply(sprintf(_("Hello %s,"), order.user.cn) + "\n\n" +
|
||
sprintf(_("An order, in a message (ID: %s) from you, was rejected for the following reason:"),
|
||
mail.message_id) + "\n " + _(order.error) + "\n" + mail_signature())
|
||
mail_reply = mail.create_simple_reject_reply(reply_intro.to_s + "\n\n" +
|
||
_("An order, in a message (ID: %{id}) from you, was rejected for the following reason:",
|
||
:id => mail.message_id).to_s + "\n " + order.error.to_s + "\n" + mail_signature())
|
||
mail_reply.sign_and_crypt(order.user.keyFingerPrint)
|
||
mail_reply.deliver
|
||
msg.delete
|
||
... | ... | |
|
||
# create transcript
|
||
logger.debug "Preparing reply"
|
||
reply_txt = sprintf(_("Hello %s,"), order.user.cn) + "\n\n"
|
||
reply_txt += _("Follows the transcript of your commands:") + "\n"
|
||
reply_txt = reply_intro.to_s + "\n\n"
|
||
reply_txt += _("Follows the transcript of your commands:").to_s + "\n"
|
||
reply_attachments = []
|
||
result_list.each do |result|
|
||
reply_txt += "> #{result.cmd}\n"
|
||
... | ... | |
s = "\n" +
|
||
"-- \n" +
|
||
"#{CyborgHood::PRODUCT} v#{CyborgHood::VERSION}\n"
|
||
s += _("Contact eMail:") + " \"#{@config.contact.name}\" <#{@config.contact.email}>\n" if @config.contact.email
|
||
s += _("Contact URL:") + " #{@config.contact.url}\n" if @config.contact.url
|
||
s += _("Contact eMail:").to_s + " \"#{@config.contact.name}\" <#{@config.contact.email}>\n" if @config.contact.email
|
||
s += _("Contact URL:").to_s + " #{@config.contact.url}\n" if @config.contact.url
|
||
s
|
||
end
|
||
end
|
||
|
||
class CommandRunner
|
||
include GetText
|
||
include CHTranslation
|
||
|
||
def self.run(order)
|
||
result_list = []
|
||
... | ... | |
rescue CyberError => e
|
||
result.message = e.message.capitalize + "."
|
||
rescue
|
||
logger.warn "Command crashed: " + $!
|
||
logger.error "Command crashed: " + $!
|
||
logger.error "Crash trace: " + $!.backtrace.join("\n")
|
||
result.message = _("Internal error. Administrator is warned.")
|
||
end
|
||
|
||
tag = result.ok ? "SUCCESS" :"FAILURE"
|
||
tag = result.ok ? "SUCCESS" : "FAILURE"
|
||
logger.debug "Command result: [#{tag}] #{result.message}"
|
||
else
|
||
logger.info "Invalid command detected: #{cmd.cmdline}"
|
||
result.message = cmd.parsing_errors.collect{|err| _(err) }.join("\n")
|
||
cmd.parsing_errors.collect{|err| logger.debug "Invalid command detected - reason: " + err.untranslated }
|
||
result.message = cmd.parsing_errors.collect{|err| err.to_s }.join("\n")
|
||
end
|
||
result_list << result
|
||
end
|
||
... | ... | |
list = CyborgHood::DnsDomain.find_by_manager(user)
|
||
txt_list = list.collect{|z| z.cn }.sort.join(", ")
|
||
result.ok = true
|
||
result.message = sprintf(_("You are manager of the following zones: %s."), txt_list)
|
||
result.message = _("You are manager of the following zones: %{zone_list}.", :zone_list => txt_list)
|
||
when "GET"
|
||
return if cmdline.empty?
|
||
case cmdline.shift.upcase
|
lib/cyborghood/base.rb | ||
---|---|---|
require 'singleton'
|
||
require 'yaml'
|
||
require 'log4r'
|
||
require 'gettext'
|
||
require "cyborghood/config"
|
||
require "cyborghood/info"
|
||
require "cyborghood/lang_additions"
|
||
require 'cyborghood/language'
|
||
|
||
module CyborgHood
|
||
include GetText
|
||
include CHTranslation
|
||
bindtextdomain("cyborghood", {:path => Config::L10N_DIR, :charset => "UTF-8"})
|
||
|
||
# severities: :grave :unrecoverable :processable :ignorable
|
||
... | ... | |
return new_conf
|
||
end
|
||
end
|
||
|
||
class I18n
|
||
include Singleton
|
||
include GetText
|
||
|
||
def initialize
|
||
@config = Config.instance
|
||
end
|
||
|
||
def available_languages
|
||
list = ['en'] + Dir.new(Config::L10N_DIR).select{|d| File.directory?(d) and d[0..0] != "." }
|
||
# local admin can restrict available languages
|
||
# (may be useful if l10n is partial due to third party plugins)
|
||
list = list & @config.i18n.restricted_language_set if @config.i18n.restricted_language_set
|
||
list = ['en'] if list.empty?
|
||
list
|
||
end
|
||
|
||
def set_language(lang)
|
||
set_locale_all(lang)
|
||
end
|
||
|
||
def set_default_language
|
||
set_language('en')
|
||
end
|
||
|
||
def set_language_for_user(user)
|
||
if user.nil?
|
||
set_default_language
|
||
else
|
||
logger.debug "User preference for language: " + user.preferredLanguage
|
||
|
||
lang = user.prefered_language(self.available_languages)
|
||
if lang.nil?
|
||
logger.debug "No available langage fits the user preference, using english"
|
||
lang = 'en'
|
||
else
|
||
logger.debug "Language better fitting user preference: " + lang
|
||
end
|
||
|
||
set_language(lang)
|
||
end
|
||
end
|
||
end
|
||
end
|
lib/cyborghood/language.rb | ||
---|---|---|
#--
|
||
# CyborgHood, a distributed system management software.
|
||
# Copyright (c) 2009 Marc Dequènes (Duck) <Duck@DuckCorp.org>
|
||
#
|
||
# This program is free software: you can redistribute it and/or modify
|
||
# it under the terms of the GNU General Public License as published by
|
||
# the Free Software Foundation, either version 3 of the License, or
|
||
# (at your option) any later version.
|
||
#
|
||
# This program is distributed in the hope that it will be useful,
|
||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
# GNU General Public License for more details.
|
||
#
|
||
# You should have received a copy of the GNU General Public License
|
||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
#++
|
||
|
||
require 'singleton'
|
||
require 'gettext'
|
||
|
||
|
||
module CyborgHood
|
||
class I18n
|
||
include Singleton
|
||
include GetText
|
||
|
||
def initialize
|
||
@config = Config.instance
|
||
end
|
||
|
||
def available_languages
|
||
list = ['en'] + Dir.new(Config::L10N_DIR).select{|d| p d; File.directory?(d) and d[0..0] != "." }
|
||
# local admin can restrict available languages
|
||
# (may be useful if l10n is partial due to third party plugins)
|
||
list = list & @config.i18n.restricted_language_set if @config.i18n.restricted_language_set
|
||
list = ['en'] if list.empty?
|
||
list
|
||
end
|
||
|
||
def set_language(lang)
|
||
set_locale_all(lang)
|
||
end
|
||
|
||
def set_default_language
|
||
set_language('en')
|
||
end
|
||
|
||
def set_language_for_user(user)
|
||
if user.nil?
|
||
set_default_language
|
||
else
|
||
logger.debug "User preference for language: " + user.preferredLanguage
|
||
|
||
lang = user.prefered_language(self.available_languages)
|
||
if lang.nil?
|
||
logger.debug "No available language fits the user preference, using english"
|
||
lang = 'en'
|
||
else
|
||
logger.debug "Language better fitting user preference: " + lang
|
||
end
|
||
|
||
set_language(lang)
|
||
end
|
||
end
|
||
end
|
||
|
||
class CHMessage
|
||
attr_reader :translated, :untranslated, :parts
|
||
|
||
def initialize(translated, untranslated, parts)
|
||
@translated = translated % parts
|
||
@untranslated = untranslated % parts
|
||
@parts = parts
|
||
end
|
||
|
||
def to_s
|
||
@translated
|
||
end
|
||
end
|
||
|
||
module CHTranslation
|
||
def self.included(base)
|
||
base.class_eval("include GetText")
|
||
|
||
# translation methods needs to be available at class level too
|
||
base.extend(self)
|
||
end
|
||
include GetText
|
||
|
||
alias :_orig :_
|
||
def _(message, parts = {})
|
||
create_tm(:_orig, message, parts)
|
||
end
|
||
|
||
alias :n_orig :n_
|
||
def n_(message, parts = {})
|
||
create_tm(:n_orig, message, parts)
|
||
end
|
||
|
||
alias :s_orig :s_
|
||
def s_(message, parts = {})
|
||
create_tm(:s_orig, message, parts)
|
||
end
|
||
|
||
alias :ns_orig :ns_
|
||
def ns_(message, parts = {})
|
||
create_tm(:ns_orig, message, parts)
|
||
end
|
||
|
||
alias :np_orig :np_
|
||
def np_(message, parts = {})
|
||
create_tm(:np_orig, message, parts)
|
||
end
|
||
|
||
def create_tm(method, message, parts)
|
||
CHMessage.new(self.send(method, message), message, parts)
|
||
end
|
||
|
||
module_function :_, :n_, :s_, :ns_, :np_
|
||
end
|
||
end
|
lib/cyborghood/mail.rb | ||
---|---|---|
class Mail < Delegator
|
||
include ActionMailer::Quoting
|
||
include ActionMailer::Utils
|
||
include GetText
|
||
include CHTranslation
|
||
|
||
MAX_DRIFT_TIME = 3600
|
||
|
||
... | ... | |
|
||
def process
|
||
if is_marked?
|
||
return MailReport.new(:error => "Replay detected.")
|
||
return MailReport.new(:error => _("Replay detected."))
|
||
end
|
||
|
||
return process_signed() if is_pgp_signed?
|
||
return process_encrypted() if is_pgp_encrypted?
|
||
|
||
MailReport.new(:error => "Mail not RFC3156 compliant.")
|
||
MailReport.new(:error => _("Mail not RFC3156 compliant."))
|
||
end
|
||
|
||
def create_reply
|
||
... | ... | |
|
||
def process_signed
|
||
sigs_check = verify_pgp_signature()
|
||
return MailReport.new(:error => "Mail not formatted correctly (signed part).") if sigs_check.nil? or sigs_check.size != 1
|
||
return MailReport.new(:error => _("Mail not formatted correctly (signed part).")) if sigs_check.nil? or sigs_check.size != 1
|
||
|
||
sig_check = sigs_check.first
|
||
return MailReport.new(:error => "Mail content tampered or badly signed: " + sig_check.to_s) unless sig_check.status == 0
|
||
return MailReport.new(:error => _("Mail content tampered or badly signed: %{sig_err}", :sig_err => sig_check.to_s)) unless sig_check.status == 0
|
||
|
||
logger.info "Mail content was properly signed by key #{sig_check.fingerprint}"
|
||
user = Person.find_by_fingerprint(sig_check.fingerprint)
|
||
return MailReport.new(:error => "Mail is from an unknown person.", :warn_sender => true) if user.nil?
|
||
return MailReport.new(:error => _("Mail is from an unknown person."), :warn_sender => true) if user.nil?
|
||
|
||
logger.info "Mail is from user #{user.uid} (#{user.cn})"
|
||
self.user = user
|
||
... | ... | |
logger.debug "Signature drift time: #{drift}"
|
||
unless drift.abs < MAX_DRIFT_TIME
|
||
if drift > 0
|
||
return MailReport.new(:error => N_("The signature was made too long ago (check your system clock). Rejected message to avoid replay attacks."), :user => user)
|
||
return MailReport.new(:error => _("The signature was made too long ago (check your system clock). Rejected message to avoid replay attacks."), :user => user)
|
||
else
|
||
# mark message to prevent later replay of the message
|
||
mark_processed(sig_check.timestamp)
|
||
return MailReport.new(:error => N_("The signature was made in the future (check your system clock). Rejected message to avoid replay attacks."), :user => user)
|
||
return MailReport.new(:error => _("The signature was made in the future (check your system clock). Rejected message to avoid replay attacks."), :user => user)
|
||
end
|
||
end
|
||
|
||
... | ... | |
end
|
||
end
|
||
|
||
MailReport.new(:error => "Mail not formatted correctly (encrypted part).")
|
||
MailReport.new(:error => _("Mail not formatted correctly (encrypted part)."))
|
||
end
|
||
|
||
def mark_dir
|
lib/cyborghood/mail_order.rb | ||
---|---|---|
order_txt = message.body if message.content_type == "text/plain"
|
||
shared_parameters = {}
|
||
end
|
||
return new(:error => N_("Mail does not contain a proper text part for commands."), :user => user) if order_txt.nil?
|
||
return new(:error => _("Mail does not contain a proper text part for commands."), :user => user) if order_txt.nil?
|
||
|
||
command_lines = order_txt.split("\n")
|
||
|
||
... | ... | |
ref = $1
|
||
d_ref, d_param = dereference_param(shared_parameters, param)
|
||
if d_ref.nil?
|
||
# TODO: a message class is needed to handle passing translatable strings with parameters (doing late sprintf for example)
|
||
errors << N_("Attachment '#{ref}' not found.")
|
||
errors << _("Attachment '%{ref}' not found.", :ref => ref)
|
||
else
|
||
used_refs << d_ref
|
||
end
|
lib/cyborghood/order.rb | ||
---|---|---|
end
|
||
|
||
class Order
|
||
include GetText
|
||
include CHTranslation
|
||
attr_reader :error, :user, :commands, :shared_parameters
|
||
|
||
def initialize(params = {})
|
||
... | ... | |
begin
|
||
raw_cmd_parts = line.shellsplit
|
||
rescue
|
||
errors << N_("Syntax error in command.")
|
||
errors << _("Syntax error in command.")
|
||
raw_cmd_parts = []
|
||
end
|
||
cmd_parts = raw_cmd_parts.collect do |word|
|
po/cyborghood.pot | ||
---|---|---|
msgid ""
|
||
msgstr ""
|
||
"Project-Id-Version: CyborgHood 0.2.0~dev\n"
|
||
"POT-Creation-Date: 2010-03-07 19:04+0100\n"
|
||
"POT-Creation-Date: 2010-04-04 02:19+0200\n"
|
||
"PO-Revision-Date: 2009-03-07 21:38+0100\n"
|
||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||
... | ... | |
msgid "Syntax error in command."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:93
|
||
msgid "Replay detected."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:99
|
||
msgid "Mail not RFC3156 compliant."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:173
|
||
msgid "Mail not formatted correctly (signed part)."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:176
|
||
msgid "Mail content tampered or badly signed: %{sig_err}"
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:180
|
||
msgid "Mail is from an unknown person."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:189
|
||
msgid ""
|
||
"The signature was made too long ago (check your system clock). Rejected "
|
||
... | ... | |
"message to avoid replay attacks."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail.rb:238
|
||
msgid "Mail not formatted correctly (encrypted part)."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail_order.rb:25
|
||
msgid "Mail does not contain a proper text part for commands."
|
||
msgstr ""
|
||
|
||
#: lib/cyborghood/mail_order.rb:38
|
||
msgid "Attachment '%{ref}' not found."
|
||
msgstr ""
|
po/cyborghood_postman.pot | ||
---|---|---|
msgid ""
|
||
msgstr ""
|
||
"Project-Id-Version: CyborgHood 0.2.0~dev\n"
|
||
"POT-Creation-Date: 2010-03-07 19:04+0100\n"
|
||
"POT-Creation-Date: 2010-04-04 02:19+0200\n"
|
||
"PO-Revision-Date: 2009-03-07 21:38+0100\n"
|
||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||
... | ... | |
"Content-Transfer-Encoding: 8bit\n"
|
||
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:143 /opt/cyborghood-dev/bin/postman:159
|
||
#: /opt/cyborghood-dev/bin/postman:173
|
||
msgid "Hello %s,"
|
||
#: /opt/cyborghood-dev/bin/postman:146 /opt/cyborghood-dev/bin/postman:162
|
||
msgid "Hello %{cn},"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:143
|
||
#: /opt/cyborghood-dev/bin/postman:146
|
||
msgid "Hello,"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:145
|
||
#: /opt/cyborghood-dev/bin/postman:148
|
||
msgid ""
|
||
"A message (ID: %s), apparently from you, was rejected for the following "
|
||
"A message (ID: %{id}), apparently from you, was rejected for the following "
|
||
"reason:"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:160
|
||
#: /opt/cyborghood-dev/bin/postman:167
|
||
msgid ""
|
||
"An order, in a message (ID: %s) from you, was rejected for the following "
|
||
"An order, in a message (ID: %{id}) from you, was rejected for the following "
|
||
"reason:"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:174
|
||
#: /opt/cyborghood-dev/bin/postman:181
|
||
msgid "Follows the transcript of your commands:"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:223
|
||
#: /opt/cyborghood-dev/bin/postman:230
|
||
msgid "Contact eMail:"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:224
|
||
#: /opt/cyborghood-dev/bin/postman:231
|
||
msgid "Contact URL:"
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:247 /opt/cyborghood-dev/bin/postman:356
|
||
#: /opt/cyborghood-dev/bin/postman:255 /opt/cyborghood-dev/bin/postman:365
|
||
msgid "Internal error. Administrator is warned."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:274
|
||
msgid "You are manager of the following zones: %s."
|
||
#: /opt/cyborghood-dev/bin/postman:283
|
||
msgid "You are manager of the following zones: %{zone_list}."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:284 /opt/cyborghood-dev/bin/postman:306
|
||
#: /opt/cyborghood-dev/bin/postman:293 /opt/cyborghood-dev/bin/postman:315
|
||
msgid "This zone is not hosted here."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:288 /opt/cyborghood-dev/bin/postman:310
|
||
#: /opt/cyborghood-dev/bin/postman:297 /opt/cyborghood-dev/bin/postman:319
|
||
msgid "You are not allowed to manage this zone."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:294
|
||
#: /opt/cyborghood-dev/bin/postman:303
|
||
msgid "Requested zone content attached."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:319
|
||
#: /opt/cyborghood-dev/bin/postman:328
|
||
msgid "Attachment has wrong content-type."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:334
|
||
#: /opt/cyborghood-dev/bin/postman:343
|
||
msgid "Invalid zone data."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:341
|
||
#: /opt/cyborghood-dev/bin/postman:350
|
||
msgid "Zone serial is not superior to current serial."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:352
|
||
#: /opt/cyborghood-dev/bin/postman:361
|
||
msgid "Zone updated."
|
||
msgstr ""
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:370
|
||
#: /opt/cyborghood-dev/bin/postman:379
|
||
msgid "Command not recognized."
|
||
msgstr ""
|
po/fr/cyborghood.po | ||
---|---|---|
msgid ""
|
||
msgstr ""
|
||
"Project-Id-Version: CyborgHood 0.2.0~dev\n"
|
||
"POT-Creation-Date: 2010-03-07 19:04+0100\n"
|
||
"PO-Revision-Date: 2009-03-07 20:59+0100\n"
|
||
"POT-Creation-Date: 2010-04-04 02:19+0200\n"
|
||
"PO-Revision-Date: 2010-04-04 20:59+0100\n"
|
||
"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
|
||
"MIME-Version: 1.0\n"
|
||
"Content-Type: text/plain; charset=UTF-8\n"
|
||
... | ... | |
|
||
#: lib/cyborghood/order.rb:57
|
||
msgid "Syntax error in command."
|
||
msgstr ""
|
||
msgstr "Erreur de syntaxe dans la commande."
|
||
|
||
#: lib/cyborghood/mail.rb:93
|
||
msgid "Replay detected."
|
||
msgstr "Rejeu détecté."
|
||
|
||
#: lib/cyborghood/mail.rb:99
|
||
msgid "Mail not RFC3156 compliant."
|
||
msgstr "Mail ne respectant pas la RFC3156."
|
||
|
||
#: lib/cyborghood/mail.rb:173
|
||
msgid "Mail not formatted correctly (signed part)."
|
||
msgstr "Mail formaté incorrectement (partie signée)."
|
||
|
||
#: lib/cyborghood/mail.rb:176
|
||
msgid "Mail content tampered or badly signed: %{sig_err}"
|
||
msgstr "Contenu du mail altéré ou mal signé: %{sig_err}"
|
||
|
||
#: lib/cyborghood/mail.rb:180
|
||
msgid "Mail is from an unknown person."
|
||
msgstr "Mail provenant d'une personne inconnue"
|
||
|
||
#: lib/cyborghood/mail.rb:189
|
||
msgid ""
|
||
... | ... | |
"La signature a été faite dans le futur (vérifiez votre horloge système. "
|
||
"Message rejeté pour éviter les attaques par rejeux."
|
||
|
||
#: lib/cyborghood/mail.rb:238
|
||
msgid "Mail not formatted correctly (encrypted part)."
|
||
msgstr "Mail formaté incorrectement (partie chiffrée)."
|
||
|
||
#: lib/cyborghood/mail_order.rb:25
|
||
msgid "Mail does not contain a proper text part for commands."
|
||
msgstr ""
|
||
"Le mail ne contient pas de partie textuelle correcte pour les commandes."
|
||
|
||
#: lib/cyborghood/mail_order.rb:38
|
||
msgid "Attachment '%{ref}' not found."
|
||
msgstr "La pièce jointe '%{ref}' n'a pas été trouvée."
|
po/fr/cyborghood_postman.po | ||
---|---|---|
msgid ""
|
||
msgstr ""
|
||
"Project-Id-Version: CyborgHood 0.2.0~dev\n"
|
||
"POT-Creation-Date: 2010-03-07 19:04+0100\n"
|
||
"PO-Revision-Date: 2009-03-07 21:27+0100\n"
|
||
"POT-Creation-Date: 2010-04-04 02:19+0200\n"
|
||
"PO-Revision-Date: 2010-04-04 21:27+0100\n"
|
||
"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
|
||
"MIME-Version: 1.0\n"
|
||
"Content-Type: text/plain; charset=UTF-8\n"
|
||
"Content-Transfer-Encoding: 8bit\n"
|
||
"Plural-Forms: nplurals=1; plural=(n != 1);\n"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:143 /opt/cyborghood-dev/bin/postman:159
|
||
#: /opt/cyborghood-dev/bin/postman:173
|
||
msgid "Hello %s,"
|
||
msgstr "Bonjour %s,"
|
||
#: /opt/cyborghood-dev/bin/postman:146 /opt/cyborghood-dev/bin/postman:162
|
||
msgid "Hello %{cn},"
|
||
msgstr "Bonjour %{cn},"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:143
|
||
#: /opt/cyborghood-dev/bin/postman:146
|
||
msgid "Hello,"
|
||
msgstr "Bonjour,"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:145
|
||
#: /opt/cyborghood-dev/bin/postman:148
|
||
msgid ""
|
||
"A message (ID: %s), apparently from you, was rejected for the following "
|
||
"A message (ID: %{id}), apparently from you, was rejected for the following "
|
||
"reason:"
|
||
msgstr ""
|
||
"Un message (ID: %s), provenant apparemment de vous, a été rejeté pour la "
|
||
"Un message (ID: %{id}), provenant apparemment de vous, a été rejeté pour la "
|
||
"raison suivante :"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:160
|
||
#: /opt/cyborghood-dev/bin/postman:167
|
||
msgid ""
|
||
"An order, in a message (ID: %s) from you, was rejected for the following "
|
||
"An order, in a message (ID: %{id}) from you, was rejected for the following "
|
||
"reason:"
|
||
msgstr ""
|
||
"Un order, dans in message (ID: %s) venant de vous, a été rejeté pour la "
|
||
"Un order, dans in message (ID: %{id}) venant de vous, a été rejeté pour la "
|
||
"raison suivante :"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:174
|
||
#: /opt/cyborghood-dev/bin/postman:181
|
||
msgid "Follows the transcript of your commands:"
|
||
msgstr "La retranscription des commandes suit :"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:223
|
||
#: /opt/cyborghood-dev/bin/postman:230
|
||
msgid "Contact eMail:"
|
||
msgstr "eMail de Contact :"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:224
|
||
#: /opt/cyborghood-dev/bin/postman:231
|
||
msgid "Contact URL:"
|
||
msgstr "URL de Contact :"
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:247 /opt/cyborghood-dev/bin/postman:356
|
||
#: /opt/cyborghood-dev/bin/postman:255 /opt/cyborghood-dev/bin/postman:365
|
||
msgid "Internal error. Administrator is warned."
|
||
msgstr "Erreur interne. L'administrateur a été prévenu."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:274
|
||
msgid "You are manager of the following zones: %s."
|
||
msgstr "Vous gérez les zones suivantes : %s."
|
||
#: /opt/cyborghood-dev/bin/postman:283
|
||
msgid "You are manager of the following zones: %{zone_list}."
|
||
msgstr "Vous gérez les zones suivantes : %{zone_list}."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:284 /opt/cyborghood-dev/bin/postman:306
|
||
#: /opt/cyborghood-dev/bin/postman:293 /opt/cyborghood-dev/bin/postman:315
|
||
msgid "This zone is not hosted here."
|
||
msgstr "Cette zone n'est pas hébergée ici."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:288 /opt/cyborghood-dev/bin/postman:310
|
||
#: /opt/cyborghood-dev/bin/postman:297 /opt/cyborghood-dev/bin/postman:319
|
||
msgid "You are not allowed to manage this zone."
|
||
msgstr "Vous n'êtes pas autorisé à gérer cette zone."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:294
|
||
#: /opt/cyborghood-dev/bin/postman:303
|
||
msgid "Requested zone content attached."
|
||
msgstr "Le contenu de la zone demandée est en pièce jointe."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:319
|
||
#: /opt/cyborghood-dev/bin/postman:328
|
||
msgid "Attachment has wrong content-type."
|
||
msgstr "La pièce jointe a un mauvais type de contenu (content-type)."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:334
|
||
#: /opt/cyborghood-dev/bin/postman:343
|
||
msgid "Invalid zone data."
|
||
msgstr "Données pour la zone invalides."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:341
|
||
#: /opt/cyborghood-dev/bin/postman:350
|
||
msgid "Zone serial is not superior to current serial."
|
||
msgstr "Le numéro de série de la zone n'est pas supèrieur à celui actuel."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:352
|
||
#: /opt/cyborghood-dev/bin/postman:361
|
||
msgid "Zone updated."
|
||
msgstr "Zone mise à jour."
|
||
|
||
#: /opt/cyborghood-dev/bin/postman:370
|
||
#: /opt/cyborghood-dev/bin/postman:379
|
||
msgid "Command not recognized."
|
||
msgstr "Commande non reconnue"
|
||
msgstr "Commande non reconnue."
|
Also available in: Unified diff
[evol] translation rework: new mechanism to handle translated/untranslated strings, make use of translation parameters, moved I18n class, translations update