/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package constant

const (
	EmailTplKeyChangeEmailTitle = "email_tpl.change_email.title"
	EmailTplKeyChangeEmailBody  = "email_tpl.change_email.body"

	EmailTplKeyNewAnswerTitle = "email_tpl.new_answer.title"
	EmailTplKeyNewAnswerBody  = "email_tpl.new_answer.body"

	EmailTplKeyNewCommentTitle = "email_tpl.new_comment.title"
	EmailTplKeyNewCommentBody  = "email_tpl.new_comment.body"

	EmailTplKeyPassResetTitle = "email_tpl.pass_reset.title"
	EmailTplKeyPassResetBody  = "email_tpl.pass_reset.body"

	EmailTplKeyRegisterTitle = "email_tpl.register.title"
	EmailTplKeyRegisterBody  = "email_tpl.register.body"

	EmailTplKeyTestTitle = "email_tpl.test.title"
	EmailTplKeyTestBody  = "email_tpl.test.body"

	EmailTplKeyInvitedAnswerTitle = "email_tpl.invited_you_to_answer.title"
	EmailTplKeyInvitedAnswerBody  = "email_tpl.invited_you_to_answer.body"

	EmailTplKeyNewQuestionTitle = "email_tpl.new_question.title"
	EmailTplKeyNewQuestionBody  = "email_tpl.new_question.body"
)
