diff --git a/docs/api/runtime-errors.po b/docs/api/runtime-errors.po
new file mode 100644
index 0000000000000000000000000000000000000000..2f2313a287fb080fd5ea595f1bb3a67228d6fa88
--- /dev/null
+++ b/docs/api/runtime-errors.po
@@ -0,0 +1,387 @@
+msgid "System.InvalidSpecName"
+msgstr "The name of specification does not match between the current runtime
+and the new runtime."
+msgid "System.SpecVersionNeedsToIncrease"
+msgstr "The specification version is not allowed to decrease between the current runtime
+and the new runtime."
+msgid "System.FailedToExtractRuntimeVersion"
+msgstr "Failed to extract the runtime version from the new runtime.
+
+Either calling `Core_version` or decoding `RuntimeVersion` failed."
+msgid "System.NonDefaultComposite"
+msgstr "Suicide called when the account has non-default composite data."
+msgid "System.NonZeroRefCount"
+msgstr "There is a non-zero reference count preventing the account from being purged."
+msgid "System.CallFiltered"
+msgstr "The origin filter prevent the call to be dispatched."
+msgid "System.MultiBlockMigrationsOngoing"
+msgstr "A multi-block migration is ongoing and prevents the current code from being replaced."
+msgid "System.NothingAuthorized"
+msgstr "No upgrade authorized."
+msgid "System.Unauthorized"
+msgstr "The submitted code is not authorized."
+msgid "Scheduler.FailedToSchedule"
+msgstr "Failed to schedule a call"
+msgid "Scheduler.NotFound"
+msgstr "Cannot find the scheduled call."
+msgid "Scheduler.TargetBlockNumberInPast"
+msgstr "Given target block number is in the past."
+msgid "Scheduler.RescheduleNoChange"
+msgstr "Reschedule failed because it does not change scheduled time."
+msgid "Scheduler.Named"
+msgstr "Attempt to use a non-named function on a named task."
+msgid "Babe.InvalidEquivocationProof"
+msgstr "An equivocation proof provided as part of an equivocation report is invalid."
+msgid "Babe.InvalidKeyOwnershipProof"
+msgstr "A key ownership proof provided as part of an equivocation report is invalid."
+msgid "Babe.DuplicateOffenceReport"
+msgstr "A given equivocation report is valid but already previously reported."
+msgid "Babe.InvalidConfiguration"
+msgstr "Submitted configuration is invalid."
+msgid "Balances.VestingBalance"
+msgstr "Vesting balance too high to send value."
+msgid "Balances.LiquidityRestrictions"
+msgstr "Account liquidity restrictions prevent withdrawal."
+msgid "Balances.InsufficientBalance"
+msgstr "Balance too low to send value."
+msgid "Balances.ExistentialDeposit"
+msgstr "Value too low to create account due to existential deposit."
+msgid "Balances.Expendability"
+msgstr "Transfer/payment would kill account."
+msgid "Balances.ExistingVestingSchedule"
+msgstr "A vesting schedule already exists for this account."
+msgid "Balances.DeadAccount"
+msgstr "Beneficiary account must pre-exist."
+msgid "Balances.TooManyReserves"
+msgstr "Number of named reserves exceed `MaxReserves`."
+msgid "Balances.TooManyHolds"
+msgstr "Number of holds exceed `VariantCountOf<T::RuntimeHoldReason>`."
+msgid "Balances.TooManyFreezes"
+msgstr "Number of freezes exceed `MaxFreezes`."
+msgid "Balances.IssuanceDeactivated"
+msgstr "The issuance cannot be modified since it is already deactivated."
+msgid "Balances.DeltaZero"
+msgstr "The delta cannot be zero."
+msgid "OneshotAccount.BlockHeightInFuture"
+msgstr "Block height is in the future."
+msgid "OneshotAccount.BlockHeightTooOld"
+msgstr "Block height is too old."
+msgid "OneshotAccount.DestAccountNotExist"
+msgstr "Destination account does not exist."
+msgid "OneshotAccount.ExistentialDeposit"
+msgstr "Destination account has a balance less than the existential deposit."
+msgid "OneshotAccount.InsufficientBalance"
+msgstr "Source account has insufficient balance."
+msgid "OneshotAccount.OneshotAccountAlreadyCreated"
+msgstr "Destination oneshot account already exists."
+msgid "OneshotAccount.OneshotAccountNotExist"
+msgstr "Source oneshot account does not exist."
+msgid "SmithMembers.OriginMustHaveAnIdentity"
+msgstr "Issuer of anything (invitation, acceptance, certification) must have an identity ID"
+msgid "SmithMembers.OriginHasNeverBeenInvited"
+msgstr "Issuer must be known as a potential smith"
+msgid "SmithMembers.InvitationIsASmithPrivilege"
+msgstr "Invitation is reseverd to smiths"
+msgid "SmithMembers.InvitationIsAOnlineSmithPrivilege"
+msgstr "Invitation is reseverd to online smiths"
+msgid "SmithMembers.InvitationAlreadyAccepted"
+msgstr "Invitation must not have been accepted yet"
+msgid "SmithMembers.InvitationOfExistingNonExcluded"
+msgstr "Invitation of an already known smith is forbidden except if it has been excluded"
+msgid "SmithMembers.InvitationOfNonMember"
+msgstr "Invitation of a non-member (of the WoT) is forbidden"
+msgid "SmithMembers.CertificationMustBeAgreed"
+msgstr "Certification cannot be made on someone who has not accepted an invitation"
+msgid "SmithMembers.CertificationOnExcludedIsForbidden"
+msgstr "Certification cannot be made on excluded"
+msgid "SmithMembers.CertificationIsASmithPrivilege"
+msgstr "Issuer must be a smith"
+msgid "SmithMembers.CertificationIsAOnlineSmithPrivilege"
+msgstr "Only online smiths can certify"
+msgid "SmithMembers.CertificationOfSelfIsForbidden"
+msgstr "Smith cannot certify itself"
+msgid "SmithMembers.CertificationReceiverMustHaveBeenInvited"
+msgstr "Receiver must be invited by another smith"
+msgid "SmithMembers.CertificationAlreadyExists"
+msgstr "Receiver must not already have this certification"
+msgid "SmithMembers.CertificationStockFullyConsumed"
+msgstr "A smith has a limited stock of certifications"
+msgid "AuthorityMembers.AlreadyIncoming"
+msgstr "Member already incoming."
+msgid "AuthorityMembers.AlreadyOnline"
+msgstr "Member already online."
+msgid "AuthorityMembers.AlreadyOutgoing"
+msgstr "Member already outgoing."
+msgid "AuthorityMembers.MemberIdNotFound"
+msgstr "Owner key is invalid as a member."
+msgid "AuthorityMembers.MemberBlacklisted"
+msgstr "Member is blacklisted."
+msgid "AuthorityMembers.MemberNotBlacklisted"
+msgstr "Member is not blacklisted."
+msgid "AuthorityMembers.MemberNotFound"
+msgstr "Member not found."
+msgid "AuthorityMembers.NotOnlineNorIncoming"
+msgstr "Neither online nor scheduled."
+msgid "AuthorityMembers.NotMember"
+msgstr "Not member."
+msgid "AuthorityMembers.SessionKeysNotProvided"
+msgstr "Session keys not provided."
+msgid "AuthorityMembers.TooManyAuthorities"
+msgstr "Too many authorities."
+msgid "Session.InvalidProof"
+msgstr "Invalid ownership proof."
+msgid "Session.NoAssociatedValidatorId"
+msgstr "No associated validator ID for account."
+msgid "Session.DuplicatedKey"
+msgstr "Registered duplicate key."
+msgid "Session.NoKeys"
+msgstr "No keys are associated with this account."
+msgid "Session.NoAccount"
+msgstr "Key setting account is not live, so it's impossible to associate keys."
+msgid "Grandpa.PauseFailed"
+msgstr "Attempt to signal GRANDPA pause when the authority set isn't live
+(either paused or already pending pause)."
+msgid "Grandpa.ResumeFailed"
+msgstr "Attempt to signal GRANDPA resume when the authority set isn't paused
+(either live or already pending resume)."
+msgid "Grandpa.ChangePending"
+msgstr "Attempt to signal GRANDPA change with one already pending."
+msgid "Grandpa.TooSoon"
+msgstr "Cannot signal forced change so soon after last."
+msgid "Grandpa.InvalidKeyOwnershipProof"
+msgstr "A key ownership proof provided as part of an equivocation report is invalid."
+msgid "Grandpa.InvalidEquivocationProof"
+msgstr "An equivocation proof provided as part of an equivocation report is invalid."
+msgid "Grandpa.DuplicateOffenceReport"
+msgstr "A given equivocation report is valid but already previously reported."
+msgid "ImOnline.InvalidKey"
+msgstr "Non existent public key."
+msgid "ImOnline.DuplicatedHeartbeat"
+msgstr "Duplicated heartbeat."
+msgid "Sudo.RequireSudo"
+msgstr "Sender must be the Sudo account."
+msgid "Preimage.TooBig"
+msgstr "Preimage is too large to store on-chain."
+msgid "Preimage.AlreadyNoted"
+msgstr "Preimage has already been noted on-chain."
+msgid "Preimage.NotAuthorized"
+msgstr "The user is not authorized to perform this action."
+msgid "Preimage.NotNoted"
+msgstr "The preimage cannot be removed since it has not yet been noted."
+msgid "Preimage.Requested"
+msgstr "A preimage may not be removed when there are outstanding requests."
+msgid "Preimage.NotRequested"
+msgstr "The preimage request cannot be removed since no outstanding requests exist."
+msgid "Preimage.TooMany"
+msgstr "More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once."
+msgid "Preimage.TooFew"
+msgstr "Too few hashes were requested to be upgraded (i.e. zero)."
+msgid "TechnicalCommittee.NotMember"
+msgstr "Account is not a member"
+msgid "TechnicalCommittee.DuplicateProposal"
+msgstr "Duplicate proposals not allowed"
+msgid "TechnicalCommittee.ProposalMissing"
+msgstr "Proposal must exist"
+msgid "TechnicalCommittee.WrongIndex"
+msgstr "Mismatched index"
+msgid "TechnicalCommittee.DuplicateVote"
+msgstr "Duplicate vote ignored"
+msgid "TechnicalCommittee.AlreadyInitialized"
+msgstr "Members are already initialized!"
+msgid "TechnicalCommittee.TooEarly"
+msgstr "The close call was made too early, before the end of the voting."
+msgid "TechnicalCommittee.TooManyProposals"
+msgstr "There can only be a maximum of `MaxProposals` active proposals."
+msgid "TechnicalCommittee.WrongProposalWeight"
+msgstr "The given weight bound for the proposal was too low."
+msgid "TechnicalCommittee.WrongProposalLength"
+msgstr "The given length bound for the proposal was too low."
+msgid "TechnicalCommittee.PrimeAccountNotMember"
+msgstr "Prime account is not a member"
+msgid "UniversalDividend.AccountNotAllowedToClaimUds"
+msgstr "This account is not allowed to claim UDs."
+msgid "Wot.NotEnoughCerts"
+msgstr "Insufficient certifications received."
+msgid "Wot.TargetStatusInvalid"
+msgstr "Target status is incompatible with this operation."
+msgid "Wot.IdtyCreationPeriodNotRespected"
+msgstr "Identity creation period not respected."
+msgid "Wot.NotEnoughReceivedCertsToCreateIdty"
+msgstr "Insufficient received certifications to create identity."
+msgid "Wot.MaxEmittedCertsReached"
+msgstr "Maximum number of emitted certifications reached."
+msgid "Wot.IssuerNotMember"
+msgstr "Issuer cannot emit a certification because it is not member."
+msgid "Wot.IdtyNotFound"
+msgstr "Issuer or receiver not found."
+msgid "Wot.MembershipRenewalPeriodNotRespected"
+msgstr "Membership can only be renewed after an antispam delay."
+msgid "Identity.IdtyAlreadyConfirmed"
+msgstr "Identity already confirmed."
+msgid "Identity.IdtyAlreadyCreated"
+msgstr "Identity already created."
+msgid "Identity.IdtyIndexNotFound"
+msgstr "Identity index not found."
+msgid "Identity.IdtyNameAlreadyExist"
+msgstr "Identity name already exists."
+msgid "Identity.IdtyNameInvalid"
+msgstr "Invalid identity name."
+msgid "Identity.IdtyNotFound"
+msgstr "Identity not found."
+msgid "Identity.InvalidSignature"
+msgstr "Invalid payload signature."
+msgid "Identity.InvalidRevocationKey"
+msgstr "Invalid revocation key."
+msgid "Identity.IssuerNotMember"
+msgstr "Issuer is not member and can not perform this action."
+msgid "Identity.NotRespectIdtyCreationPeriod"
+msgstr "Identity creation period is not respected."
+msgid "Identity.OwnerKeyAlreadyRecentlyChanged"
+msgstr "Owner key already changed recently."
+msgid "Identity.OwnerKeyAlreadyUsed"
+msgstr "Owner key already used."
+msgid "Identity.ProhibitedToRevertToAnOldKey"
+msgstr "Reverting to an old key is prohibited."
+msgid "Identity.AlreadyRevoked"
+msgstr "Already revoked."
+msgid "Identity.CanNotRevokeUnconfirmed"
+msgstr "Can not revoke identity that never was member."
+msgid "Identity.CanNotRevokeUnvalidated"
+msgstr "Can not revoke identity that never was member."
+msgid "Identity.AccountNotExist"
+msgstr "Cannot link to an inexisting account."
+msgid "Identity.InsufficientBalance"
+msgstr "Insufficient balance to create an identity."
+msgid "Membership.MembershipNotFound"
+msgstr "Membership not found, can not renew."
+msgid "Membership.AlreadyMember"
+msgstr "Already member, can not add membership."
+msgid "Certification.OriginMustHaveAnIdentity"
+msgstr "Issuer of a certification must have an identity"
+msgid "Certification.CannotCertifySelf"
+msgstr "Identity cannot certify itself."
+msgid "Certification.IssuedTooManyCert"
+msgstr "Identity has already issued the maximum number of certifications."
+msgid "Certification.NotEnoughCertReceived"
+msgstr "Insufficient certifications received."
+msgid "Certification.NotRespectCertPeriod"
+msgstr "Identity has issued a certification too recently."
+msgid "Certification.CertAlreadyExists"
+msgstr "Can not add an already-existing cert"
+msgid "Certification.CertDoesNotExist"
+msgstr "Can not renew a non-existing cert"
+msgid "Distance.AlreadyInEvaluation"
+msgstr "Distance is already under evaluation."
+msgid "Distance.TooManyEvaluationsByAuthor"
+msgstr "Too many evaluations requested by author."
+msgid "Distance.TooManyEvaluationsInBlock"
+msgstr "Too many evaluations for this block."
+msgid "Distance.NoAuthor"
+msgstr "No author for this block."
+msgid "Distance.CallerHasNoIdentity"
+msgstr "Caller has no identity."
+msgid "Distance.CallerIdentityNotFound"
+msgstr "Caller identity not found."
+msgid "Distance.CallerNotMember"
+msgstr "Caller not member."
+msgid "Distance.CallerStatusInvalid"
+msgstr ""
+msgid "Distance.TargetIdentityNotFound"
+msgstr "Target identity not found."
+msgid "Distance.QueueFull"
+msgstr "Evaluation queue is full."
+msgid "Distance.TooManyEvaluators"
+msgstr "Too many evaluators in the current evaluation pool."
+msgid "Distance.WrongResultLength"
+msgstr "Evaluation result has a wrong length."
+msgid "Distance.TargetMustBeUnvalidated"
+msgstr "Targeted distance evaluation request is only possible for an unvalidated identity."
+msgid "AtomicSwap.AlreadyExist"
+msgstr "Swap already exists."
+msgid "AtomicSwap.InvalidProof"
+msgstr "Swap proof is invalid."
+msgid "AtomicSwap.ProofTooLarge"
+msgstr "Proof is too large."
+msgid "AtomicSwap.SourceMismatch"
+msgstr "Source does not match."
+msgid "AtomicSwap.AlreadyClaimed"
+msgstr "Swap has already been claimed."
+msgid "AtomicSwap.NotExist"
+msgstr "Swap does not exist."
+msgid "AtomicSwap.ClaimActionMismatch"
+msgstr "Claim action mismatch."
+msgid "AtomicSwap.DurationNotPassed"
+msgstr "Duration has not yet passed for the swap to be cancelled."
+msgid "Multisig.MinimumThreshold"
+msgstr "Threshold must be 2 or greater."
+msgid "Multisig.AlreadyApproved"
+msgstr "Call is already approved by this signatory."
+msgid "Multisig.NoApprovalsNeeded"
+msgstr "Call doesn't need any (more) approvals."
+msgid "Multisig.TooFewSignatories"
+msgstr "There are too few signatories in the list."
+msgid "Multisig.TooManySignatories"
+msgstr "There are too many signatories in the list."
+msgid "Multisig.SignatoriesOutOfOrder"
+msgstr "The signatories were provided out of order; they should be ordered."
+msgid "Multisig.SenderInSignatories"
+msgstr "The sender was contained in the other signatories; it shouldn't be."
+msgid "Multisig.NotFound"
+msgstr "Multisig operation not found when attempting to cancel."
+msgid "Multisig.NotOwner"
+msgstr "Only the account that originally created the multisig is able to cancel it."
+msgid "Multisig.NoTimepoint"
+msgstr "No timepoint was given, yet the multisig operation is already underway."
+msgid "Multisig.WrongTimepoint"
+msgstr "A different timepoint was given to the multisig operation that is underway."
+msgid "Multisig.UnexpectedTimepoint"
+msgstr "A timepoint was given, yet no multisig operation is underway."
+msgid "Multisig.MaxWeightTooLow"
+msgstr "The maximum weight information provided was too low."
+msgid "Multisig.AlreadyStored"
+msgstr "The data to be stored is already stored."
+msgid "ProvideRandomness.QueueFull"
+msgstr "Request randomness queue is full."
+msgid "Proxy.TooMany"
+msgstr "There are too many proxies registered or too many announcements pending."
+msgid "Proxy.NotFound"
+msgstr "Proxy registration not found."
+msgid "Proxy.NotProxy"
+msgstr "Sender is not a proxy of the account to be proxied."
+msgid "Proxy.Unproxyable"
+msgstr "A call which is incompatible with the proxy type's filter was attempted."
+msgid "Proxy.Duplicate"
+msgstr "Account is already a proxy."
+msgid "Proxy.NoPermission"
+msgstr "Call may not be made by proxy because it may escalate its privileges."
+msgid "Proxy.Unannounced"
+msgstr "Announcement, if made at all, was made too recently."
+msgid "Proxy.NoSelfProxy"
+msgstr "Cannot add self as proxy."
+msgid "Utility.TooManyCalls"
+msgstr "Too many calls batched."
+msgid "Treasury.InsufficientProposersBalance"
+msgstr "Proposer's balance is too low."
+msgid "Treasury.InvalidIndex"
+msgstr "No proposal, bounty or spend at that index."
+msgid "Treasury.TooManyApprovals"
+msgstr "Too many approvals in the queue."
+msgid "Treasury.InsufficientPermission"
+msgstr "The spend origin is valid but the amount it is allowed to spend is lower than the
+amount to be spent."
+msgid "Treasury.ProposalNotApproved"
+msgstr "Proposal has not been approved."
+msgid "Treasury.FailedToConvertBalance"
+msgstr "The balance of the asset kind is not convertible to the balance of the native asset."
+msgid "Treasury.SpendExpired"
+msgstr "The spend has expired and cannot be claimed."
+msgid "Treasury.EarlyPayout"
+msgstr "The spend is not yet eligible for payout."
+msgid "Treasury.AlreadyAttempted"
+msgstr "The payment has already been attempted."
+msgid "Treasury.PayoutError"
+msgstr "There was some issue with the mechanism of payment."
+msgid "Treasury.NotAttempted"
+msgstr "The payout was not yet attempted/claimed."
+msgid "Treasury.Inconclusive"
+msgstr "The payment has neither failed nor succeeded yet."
diff --git a/xtask/src/gen_doc.rs b/xtask/src/gen_doc.rs
index fdae3b0e886ac8a51ae1ece1fc2fbf38dfdd7c74..9e4adf51bf7166cdfa8081a4f68281edc2002479 100644
--- a/xtask/src/gen_doc.rs
+++ b/xtask/src/gen_doc.rs
@@ -44,7 +44,7 @@ const CALLS_DOC_FILEPATH: &str = "docs/api/runtime-calls.md";
 const EVENTS_DOC_FILEPATH: &str = "docs/api/runtime-events.md";
 const ERRORS_DOC_FILEPATH: &str = "docs/api/runtime-errors.md";
 const ERRORS_PO_FILEPATH: &str = "docs/api/runtime-errors.po";
-const TEMPLATES_GLOB: &str = "xtask/res/templates/*.md";
+const TEMPLATES_GLOB: &str = "xtask/res/templates/*.{md,po}";
 const WEIGHT_FILEPATH: &str = "runtime/gdev/src/weights/";
 
 // define structs and implementations