const joiConfig = {
  messages: {
    vi: {
      'number.base': '{{#label}} phải là một số',
      'number.greater': '{{#label}} phải lớn hơn {{#limit}}',
      'number.infinity': '{{#label}} không thể là vô cực',
      'number.integer': '{{#label}} phải là số nguyên',
      'number.less': '{{#label}} phải nhỏ hơn {{#limit}}',
      'number.max': '{{#label}} phải nhỏ hơn hoặc bằng {{#limit}}',
      'number.min': '{{#label}} phải lớn hơn hoặc bằng {{#limit}}',
      'number.multiple': '{{#label}} phải là bội số của {{#multiple}}',
      'number.negative': '{{#label}} phải là số âm',
      'number.port': '{{#label}} phải là một cổng hợp lệ',
      'number.positive': '{{#label}} phải là số dương',
      'number.precision': '{{#label}} không được có nhiều hơn {{#limit}} chữ số thập phân',
      'number.unsafe': '{{#label}} phải là số an toàn',
      'string.alphanum': '{{#label}} chỉ được chứa các ký tự chữ và số',
      'string.base': '{{#label}} phải là một chuỗi',
      'string.base64': '{{#label}} phải là chuỗi base64 hợp lệ',
      'string.creditCard': '{{#label}} phải là thẻ tín dụng',
      'string.dataUri': '{{#label}} phải là một chuỗi dataUri hợp lệ',
      'string.domain': '{{#label}} phải chứa một tên miền hợp lệ',
      'string.email': '{{#label}} phải là email hợp lệ',
      'string.empty': '{{#label}} không được để trống',
      'string.guid': '{{#label}} phải là GUID hợp lệ',
      'string.hex': '{{#label}} chỉ được chứa các ký tự thập lục phân',
      'string.hexAlign': '{{#label}} biểu diễn được giải mã hex phải được căn chỉnh theo byte',
      'string.hostname': '{{#label}} phải là tên máy chủ hợp lệ',
      'string.ip': '{{#label}} phải là địa chỉ ip hợp lệ với CIDR {{#cidr}}',
      'string.ipVersion': '{{#label}} phải là địa chỉ IP hợp lệ của một trong các phiên bản sau {{#version}} với CIDR {{#cidr}}',
      'string.isoDate': '{{#label}} phải ở định dạng iso',
      'string.isoDuration': '{{#label}} phải là thời lượng ISO 8601 hợp lệ',
      'string.length': 'Độ dài {{#label}} phải dài {{#limit}} ký tự',
      'string.lowercase': '{{#label}} chỉ được chứa các ký tự chữ thường',
      'string.max': 'Độ dài {{#label}} phải nhỏ hơn hoặc bằng {{#limit}} ký tự',
      'string.min': 'Độ dài {{#label}} phải dài ít nhất {{#limit}} ký tự',
      'string.normalize': '{{#label}} phải được chuẩn hóa unicode trong biểu mẫu {{#form}}',
      'string.token': '{{#label}} chỉ được chứa các ký tự chữ và số và dấu gạch dưới',
      'string.pattern.base': '{{#label}} với giá trị {:[.]} không khớp với mẫu được yêu cầu: {{#regex}}',
      'string.pattern.name': '{{#label}} với giá trị {:[.]} không khớp với mẫu {{#name}}',
      'string.pattern.invert.base': '{{#label}} với giá trị {:[.]} khớp với mẫu đảo ngược: {{#regex}}',
      'string.pattern.invert.name': '{{#label}} với giá trị {:[.]} khớp với mẫu {{#name}} đảo ngược',
      'string.trim': '{{#label}} không được có khoảng trắng ở đầu hoặc cuối',
      'string.uri': '{{#label}} phải là một uri hợp lệ',
      'string.uriCustomScheme': '{{#label}} phải là một uri hợp lệ với lược đồ khớp với mẫu {{#scheme}}',
      'string.uriRelativeOnly': '{{#label}} phải là một uri tương đối hợp lệ',
      'string.uppercase': '{{#label}} chỉ được chứa các ký tự chữ hoa',
      'object.and': '{{#label}} chứa {{#presentWithLabels}} mà không có các cấp ngang hàng bắt buộc của nó {{#missingWithLabels}}',
      'object.assert':
        '{{#label}} không hợp lệ vì {if(#subject.key, `"` + #subject.key + `" không thể ` + (#message || "vượt qua kiểm tra xác nhận" ), #message || "xác nhận thất bại")}',
      'object.base': '{{#label}} phải thuộc loại {{#type}}',
      'object.instance': '{{#label}} phải là phiên bản của {{:#type}}',
      'object.length': '{{#label}} phải có khóa {{#limit}}{if(#limit == 1, "", "s")}',
      'object.max': '{{#label}} phải có khóa nhỏ hơn hoặc bằng {{#limit}}{if(#limit == 1, "", "s")}',
      'object.min': '{{#label}} phải có ít nhất {{#limit}} khóa{if(#limit == 1, "", "s")}',
      'object.missing': '{{#label}} phải chứa ít nhất một trong {{#peersWithLabels}}',
      'object.nand': '{{:#mainWithLabel}} không được tồn tại đồng thời với {{#peersWithLabels}}',
      'object.oxor': '{{#label}} chứa xung đột giữa các ngang hàng độc quyền tùy chọn {{#peersWithLabels}}',
      'object.pattern.match': 'Các khóa {{#label}} không khớp với các yêu cầu về mẫu',
      'object.refType': '{{#label}} phải là tham chiếu Joi',
      'object.regex': '{{#label}} phải là một đối tượng RegExp',
      'object.rename.multiple': '{{#label}} không thể đổi tên {{:#from}} vì tính năng đổi tên nhiều lần bị tắt và một khóa khác đã được đổi tên thành {{:#to}}',
      'object.rename.override': '{{#label}} không thể đổi tên {{:#from}} vì tính năng ghi đè bị tắt và mục tiêu {{:#to}} tồn tại',
      'object.schema': '{{#label}} phải là lược đồ Joi của loại {{#type}}',
      'object.unknown': '{{#label}} không được phép',
      'object.with': '{{:#mainWithLabel}} thiếu thiết bị ngang hàng bắt buộc {{:#peerWithLabel}}',
      'object.without': '{{:#mainWithLabel}} xung đột với thiết bị ngang hàng bị cấm {{:#peerWithLabel}}',
      'object.xor': '{{#label}} chứa xung đột giữa các đồng nghiệp độc quyền {{#peersWithLabels}}',
      'symbol.base': '{{#label}} phải là một ký hiệu',
      'symbol.map': '{{#label}} phải là một trong {{#map}}',
      'alternatives.all': '{{#label}} không khớp với tất cả các loại được yêu cầu',
      'alternatives.any': '{{#label}} không khớp với bất kỳ loại nào được phép',
      'alternatives.match': '{{#label}} không khớp với bất kỳ loại nào được phép',
      'alternatives.one': '{{#label}} khớp với nhiều loại được phép',
      'alternatives.types': '{{#label}} phải là một trong {{#types}}',
      'any.custom': '{{#label}} xác thực tùy chỉnh không thành công do {{#error.message}}',
      'any.default': '{{#label}} đã gây ra lỗi khi chạy phương thức mặc định',
      'any.failover': '{{#label}} đã gây ra lỗi khi chạy phương thức chuyển đổi dự phòng',
      'any.invalid': '{{#label}} chứa giá trị không hợp lệ',
      'any.only': '{{#label}} phải là {if(#valids.length == 1, "", "một trong số ")}{{#valids}}',
      'any.ref': '{{#label}} {{#arg}} tham chiếu {{:#ref}} mà {{#reason}}',
      'any.required': '{{#label}} là bắt buộc',
      'any.unknown': '{{#label}} không được phép',
      'array.base': '{{#label}} phải là một mảng',
      'array.excludes': '{{#label}} chứa giá trị bị loại trừ',
      'array.hasKnown': '{{#label}} không chứa ít nhất một đối sánh bắt buộc đối với loại {:#patternLabel}',
      'array.hasUnknown': '{{#label}} không chứa ít nhất một kết quả khớp bắt buộc',
      'array.includes': '{{#label}} không khớp với bất kỳ loại nào được phép',
      'array.includesRequiredBoth': '{{#label}} không chứa {{#knownMisses}} và {{#unknownMisses}} (các) giá trị bắt buộc khác',
      'array.includesRequiredKnowns': '{{#label}} không chứa {{#knownMisses}}',
      'array.includesRequiredUnknowns': '{{#label}} không chứa (các) giá trị bắt buộc của {{#unknownMisses}}',
      'array.length': '{{#label}} phải chứa {{#limit}} mục',
      'array.max': '{{#label}} phải chứa ít hơn hoặc bằng {{#limit}} mục',
      'array.min': '{{#label}} phải chứa ít nhất {{#limit}} mục',
      'array.orderedLength': '{{#label}} phải chứa tối đa {{#limit}} mục',
      'array.sort': '{{#label}} phải được sắp xếp theo thứ tự {#order} theo {{#by}}',
      'array.sort.mismatching': 'Không thể sắp xếp {{#label}} do loại không khớp',
      'array.sort.unsupported': 'Không thể sắp xếp {{#label}} do loại {#type} không được hỗ trợ',
      'array.sparse': '{{#label}} không được là mục mảng thưa thớt',
      'array.unique': '{{#label}} chứa một giá trị trùng lặp',
      'binary.base': '{{#label}} phải là bộ đệm hoặc chuỗi',
      'binary.length': '{{#label}} phải là {{#limit}} byte',
      'binary.max': '{{#label}} phải nhỏ hơn hoặc bằng {{#limit}} byte',
      'binary.min': '{{#label}} phải có ít nhất {{#limit}} byte',
      'boolean.base': '{{#label}} phải là một boolean',
      'date.base': '{{#label}} phải là một ngày hợp lệ',
      'date.format': '{{#label}} phải ở dạng {msg("date.format." + #format) || #format} định dạng',
      'date.greater': '{{#label}} phải lớn hơn {{:#limit}}',
      'date.less': '{{#label}} phải nhỏ hơn {{:#limit}}',
      'date.max': '{{#label}} phải nhỏ hơn hoặc bằng {{:#limit}}',
      'date.min': '{{#label}} phải lớn hơn hoặc bằng {{:#limit}}',
      'date.format.iso': 'Ngày theo tiêu chuẩn ISO 8601',
      'date.format.javascript': 'dấu thời gian hoặc số mili giây',
      'date.format.unix': 'dấu thời gian hoặc số giây',
      'function.arity': '{{#label}} phải có số nguyên là {{#n}}',
      'function.class': '{{#label}} phải là một lớp',
      'function.maxArity': '{{#label}} phải có arity nhỏ hơn hoặc bằng {{#n}}',
      'function.minArity': '{{#label}} phải có một arity lớn hơn hoặc bằng {{#n}}',
    },
  },
  errors: { language: 'vi' },
};

export default joiConfig;
