code: public function getAttributeLabel($attribute)
      {
          $labels = $this->attributeLabels();
          if (isset($labels[$attribute])) {
              return $labels[$attribute];
          } elseif (strpos($attribute, '.')) {
              $attributeParts = explode('.', $attribute);
              $neededAttribute = array_pop($attributeParts);
  
              $relatedModel = $this;
              foreach ($attributeParts as $relationName) {
                  if ($relatedModel->isRelationPopulated($relationName) && $relatedModel->$relationName instanceof self) {
                      $relatedModel = $relatedModel->$relationName;
                  } else {
                      try {
                          $relation = $relatedModel->getRelation($relationName);
                      } catch (InvalidParamException $e) {
                          return $this->generateAttributeLabel($attribute);
                      }
                      /* @var $modelClass ActiveRecordInterface */
                      $modelClass = $relation->modelClass;
                      $relatedModel = $modelClass::instance();
                  }
              }
  
              $labels = $relatedModel->attributeLabels();
              if (isset($labels[$neededAttribute])) {
                  return $labels[$neededAttribute];
              }
          }
  
          return $this->generateAttributeLabel($attribute);
      }
docs: Returns the text label for the specified attribute.
  If the attribute looks like `relatedModel.attribute`, then the attribute will be received from the related model.
  @param string $attribute the attribute name
  @return string the attribute label
  @see generateAttributeLabel()
  @see attributeLabels()