在翻译时在lang文件中使用自定义模型名称

时间:2017-10-10 00:03:20

标签: laravel laravel-5

所以假设我在子目录中有2个模型

App\Models\AotherModelFolder\MyModel
App\Models\Custom\Test

我将其作为用户执行操作的模型类型存储在数据库中,

id | user_id | action | model_type | model_id
1  |  1      | deleted|  App\Models\AotherModelFolder\MyModel | 1
2  |  1      | updated|  App\Models\Custom\Test | 2

我想发布行动和他们执行行动的部分,所以让我们说

{{ __("You :action on :model with an id of :id", [
    'action', $activity->action, 
    'model', $activity->model_type, 
    'id', $activity->model_id, 
]) }}

这将在App \ Models \ AotherModelFolder \ MyModel上删除,ID为1

我试图不显示整个模型,而是将其替换为让我们说My model

我会有多个,所以我可以在数组中播放它们然后从中拉出名字吗?我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

我会根据您的fallback_locale通常en创建一个语言文件 /resources/lang/en/models.json并列出所有模型及其缩短方式:

{
    "App\Models\AotherModelFolder\MyModel": "My model"
}

如果您想为不同的语言设置不同的名称,请将文件复制到右侧文件夹中进行翻译。

接下来,我将编辑/创建另一个文件,每个文件都针对您要支持的每种语言,例如: /resources/lang/en/messages.json

{
    "action_preformed": "You :action on :model with an id of :id"
}

如果您拥有所有邮件,请将相同的文件复制到例如/resources/lang/es/messages.json
并翻译文本"You :action on :model with an id of :id"

现在在你的代码中你可以使用:

{{ __("messages.action_preformed", [
    'action' => $activity->action,
    'model' => trans('models.' . $activity->model_type),
    'id' => $activity->model_id,
]) }}

如果您真的想要翻译消息,那么您也应该以同样的方式翻译deletedupdated

有关该主题的更多信息:https://laravel.com/docs/5.5/localization

答案 1 :(得分:0)

你可以定义一个关系" morph map"指示Eloquent为每个模型使用自定义名称而不是类名:

use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'posts' => 'App\Post',
    'videos' => 'App\Video',
]);

您可以在morphMap的{​​{1}}功能中注册boot,也可以根据需要创建单独的服务提供商。

答案 2 :(得分:0)

好的很简单,你想在某些型号上记录用户操作。

并且您只想显示模型的名称。

例如: 我们在某些型号上有用户更改,例如:App \ User

记录将是:

action: delete
model: App\User
id: 43

只显示用户,你可以这样做:

$model = $model; // which is "App\User"
$modelName = class_basename(new $model()); // this will return User

或更好的方法:

您可以定义变量,例如:该模型中的modelName,

对于App \ User Model,它将是

public $modelName = "User Model";

你可以做到

$model = $model; // which is: "App\User"
$modelName = (new $model())->modelName;

或另一个:D

您可以在App \ Model类

中定义静态var
public static $modelName = "my User Model";

然后你可以这样称呼它:

$model = $model;
$modelName = $model::$modelName;